Powodem otrzymaniu oryginalnego błędu jest to, że Swift, Array
to ogólny kontener, który przechowuje wartości określonego typu. Więc możesz mieć Array<Int>
, który przechowuje liczby całkowite lub Array<String>
, które przechowuje ciągi. Ale nie możesz mieć tylko Array
. Typ obiektu, który zawiera tablica, jest parametrem generycznym, a Swift narzeka, ponieważ nie może dowiedzieć się, jaki powinien być ten typ. Czasami może wywnioskować ten typ z kontekstu kodu wokół niego, ale nie zawsze, jak w tym przypadku.
Można rozwiązać ten problem poprzez podanie typu rzeczy są przechowywane:
IBAction func loadData(sender: AnyObject) {
if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array<Int> {
self.showDataLabel.text = toString(testCompositeArray)
}
}
zamiast pisać Array<Int>
, można napisać krótszą formę, [Int]
Można też rozwiązać problem za pomocą NSArray
, jak już zauważyłeś. W przeciwieństwie do Array
, NSArray
nie używa generycznych, ponieważ pochodzi z Objective-C, który ma inne podejście do Swift. Zamiast tego, NSArray
posiada tylko jeden rodzaj rzeczy, AnyObject
. Jest to odniesienie, które może wskazywać na wystąpienia dowolnej klasy.
Istnieje jednak poważna wadą używania NSArray
i AnyObject
, co oznacza, że za każdym razem, gdy używasz wartości, którą zawierają, często musisz "rzucić" wartość na rzeczywistą rzecz, np. Liczbę całkowitą lub ciąg. Może to być ból, a co gorsza, czasami może powodować błędy, zakładając, że masz coś w rodzaju, gdy masz inną. Swift na ogół zachęca Cię do dokładniejszego opisywania typów, aby uniknąć takich błędów.
Świetna odpowiedź, pomogła mi uchwycić koncepcję Generics ... Wreszcie! – DogCoffee