2015-04-17 14 views
6

Ho una funzione Swift generico come questo:Funzione generica senza parametro di input in Swift?

func toNSArray<T>() -> [T] { 
... 
} 

Il compilatore fornisce alcuna errore, ma non so come chiamare questa funzione. Ho provato:

jList.toNSArray<String>() 
jList.<String>toNSArray() 

ma non ha funzionato.

Come si chiama una funzione generica in Swift senza parametri di input?

+2

estraneo alla domanda, ma questa funzione mi rende nervoso per due motivi - uno è, si chiama 'toNSArray' ma restituisce un array di Swift non un' NSArray'. L'altro è che sembra che potrebbe fallire se i tipi contenuti non sono tutti 'T', ma il tipo restituito è non opzionale (anche se forse popola l'array solo con i valori che _can_ possono essere forzati a' T') –

risposta

12

dovete dire Swift ciò che il tipo di ritorno deve essere attraverso alcuni contesto di chiamata:

// either 
let a: [Int] = jList.toNSArray() 

// or, if you aren’t assigning to a variable 
someCall(jList.toNSArray() as [Int]) 

nota, in quest'ultimo caso, questo sarebbe necessario solo se someCall preso un tipo di vago come Any come la sua argomentazione. Se invece, someCall è specificato di prendere un [Int] come argomento, la funzione stessa fornisce il contesto e si può solo scrivere someCall(jList.toNSArray())

In realtà a volte contesto può essere molto tenue dedurre! Questo funziona, per esempio:

extension Array { 
    func asT<T>() -> [T] { 
     var results: [T] = [] 
     for x in self { 
      if let y = x as? T { 
       results.append(y) 
      } 
     } 
     return results 
    } 
} 


let a: [Any] = [1,2,3, "heffalump"] 

// here, it’s the 0, defaulting to Int, that tells asT what T is... 
a.asT().reduce(0, combine: +) 
+0

Potresti spiegare l'ultima riga della tua risposta? – confile

+1

Intendi il 'ridurre'? 'reduce' è una funzione che riduce gli array a valori singoli. Qui, prende una serie di numeri interi e un valore iniziale pari a zero, e quindi li combina successivamente con la funzione fornita (in questo caso, '+'), risultante nel numero 6. Poiché '+' e 0 devono significare i numeri sono numeri interi, il tipo restituito da 'asT 'può essere dedotto come un numero intero. –

Problemi correlati