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.
Große Antwort, half mir, das Konzept der Generika zu begreifen ... Endlich! – DogCoffee