Sie müssen Swift sagen, was der Rückgabetyp durch einige Aufruf-Kontext sein muss:
// either
let a: [Int] = jList.toNSArray()
// or, if you aren’t assigning to a variable
someCall(jList.toNSArray() as [Int])
Hinweis, im letzteren Fall wäre dies nur dann erforderlich, wenn someCall
eine vage Art nahm wie Any
als sein Argument. Wenn stattdessen wird someCall
ein [Int]
als Argument nehmen angegeben, die Funktion selbst liefert den Kontext und Sie können einfach schreiben someCall(jList.toNSArray())
In der Tat manchmal kann der Kontext sehr tenuously geschlossen werden! Dies funktioniert, zum Beispiel:
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: +)
keinen Zusammenhang mit der Frage, aber diese Funktion macht mich aus zwei Gründen nervös - man ist, es heißt 'toNSArray', aber es gibt ein Swift-Array keine' NSArray'. Der andere ist, dass es so aussieht, als könnte es fehlschlagen, wenn die enthaltenen Typen nicht alle "T" sind, aber der Rückgabetyp ist nicht optional (obwohl er das Array nur mit den Werten bevölkert, die zu "T" gezwungen werden können) –