2015-05-21 12 views
34

Próbuję zapisać tablicę przy pomocy NSUserDefaults, a następnie załadować tablicę, ale otrzymuję błąd "nie można wywnioskować z argumentu dla parametru ogólnego". Czy coś robię źle? Wydaje się, że nikt nie ma szybkiego problemu, więc nie mogę znaleźć żadnych rozwiązań.nie można wywnioskować, że argument parametru ogólnego jest

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

Odpowiedz

58

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.

+1

Świetna odpowiedź, pomogła mi uchwycić koncepcję Generics ... Wreszcie! – DogCoffee

Powiązane problemy