2015-04-17 10 views
6

Ich habe eine generische Swift-Funktion wie folgt aus:Generische Funktion ohne Eingangsparameter in Swift?

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

Der Compiler gibt keinen Fehler, aber ich weiß nicht, wie diese Funktion aufzurufen. Ich habe versucht:

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

aber es hat nicht funktioniert.

Wie rufe ich eine generische Funktion in Swift ohne Eingabeparameter auf?

+2

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) –

Antwort

12

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: +) 
+0

Könnten Sie bitte die letzte Zeile Ihrer Antwort erklären? – confile

+1

Sie meinen das "Reduzieren"? 'reduce' ist eine Funktion, die Arrays auf einzelne Werte kocht. Hier nimmt es ein Array von ganzen Zahlen und einen Startwert von Null und kombiniert sie dann nacheinander mit der gelieferten Funktion (in diesem Fall '+'), was zu der Zahl 6 führt. Da '+' und 0 bedeuten müssen Die Zahlen sind Ganzzahlen, der Typ, der von 'asT' zurückgegeben wird, kann als Ganzzahl gewertet werden. –