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: +)
fonte
2015-04-17 11:08:38
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') –