2015-05-21 9 views
34

Ich versuche, ein Array mit NSUserDefaults zu speichern und dann das Array zu laden, aber ich bekomme den Fehler "Argument für generische Parameter konnte nicht abgeleitet werden." Was mache ich falsch? Niemand scheint dieses Problem schnell zu haben, daher kann ich keine Lösungen finden.Argument für generische Parameter konnte nicht abgeleitet werden

IBAction func loadData(sender: AnyObject) { 
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array {   
     self.showDataLabel.text = defaults.objectForKey("testScoreSATArray") as Array 
    } 
} 

Antwort

58

Der Grund, warum Sie Ihren ursprünglichen Fehler empfangen ist, dass in Swift, Array ein generischen Container ist, die Werte eines bestimmten Typs enthält. Sie können also eine Array<Int> haben, die ganze Zahlen enthält, oder eine Array<String>, die Strings enthält. Aber Sie können nicht nur eine Array haben. Der Typ der Sache, die das Array enthält, ist der generische Parameter, und Swift beschweren sich, weil es nicht herausfinden kann, was dieser Typ sein soll. Manchmal kann er diesen Typ aus dem Kontext des umgebenden Codes ableiten, aber nicht immer, wie in diesem Fall.

Sie können das Problem lösen, indem die Art der Sache geben Sie speichern:

IBAction func loadData(sender: AnyObject) { 
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array<Int> { 

      self.showDataLabel.text = toString(testCompositeArray) 
    } 
} 

Statt Array<Int> zu schreiben, können Sie die kürzere Form schreiben, [Int]

Sie können auch das Problem lösen mit NSArray, wie Sie gefunden haben. Im Gegensatz zu Array verwendet NSArray keine Generika, da es aus Objective-C stammt, das einen anderen Ansatz für Swift hat. Stattdessen enthält NSArray nur eine Art von Sache, eine AnyObject. Dies ist eine Referenz, die auf Instanzen jeder Klasse verweisen kann.

Allerdings gibt es einen großen Nachteil zu verwenden NSArray und AnyObject, das ist, dass Sie jedes Mal, wenn Sie einen Wert verwenden, müssen Sie oft den Wert zu einer realen Sache, wie eine ganze Zahl oder eine Zeichenfolge. Dies kann ein Schmerz sein, und schlimmer kann manchmal Fehler verursachen, wenn Sie annehmen, dass Sie eine Art von Sache haben, wenn Sie tatsächlich eine andere haben. Swift ermutigt Sie im Allgemeinen, sich genauer mit Typen zu befassen, um Fehler wie diese zu vermeiden.

+1

Große Antwort, half mir, das Konzept der Generika zu begreifen ... Endlich! – DogCoffee