2015-05-01 22 views

risposta

13

dovrebbe essere:

var apples = userDefaults.dictionaryForKey("apples_array") 
println(apples?[appleId]) 

Il problema qui è che tipo [NSObject : AnyObject]? implica un tipo facoltativo, il che significa che stai tentando di chiamare un pedice in quello che è essenzialmente un enum. Quando si tenta di farlo, non viene dichiarato alcun indice, quindi il sistema si strozza.

Aggiungendo il ? stiamo dicendo, scartare questo valore se possibile, e quindi chiamare il pedice. In questo modo il sistema deduce il tipo [NSObject : AnyObject] per le dichiarazioni di pedici e tutto è ok.

È inoltre possibile utilizzare ! per forzare uno scartare, ma questo si bloccherà se apples è nullo. Un altro modo possibile per scrivere questo sarebbe:

let apples = userDefaults.dictionaryForKey("apples_array") ?? [:] 
println(apples[appleId]) 

In questo modo, le mele non è più facoltativa e avrà sempre la sintassi pedice. Non è necessario scartare.

+1

Beh io ho questo problema, ma il mio dizionario non è un optional .. Impossibile iscrivere un valore di tipo '[String: AnyObject]' con un indice di tipo 'String' – SwiftMatt

+0

@SwiftMatt Non sono sicuro, ma questo cambia il gioco possibile con Swift 2.x. La soluzione è sempre la stessa. – ff10

4

penso che sia molto più chiaro per usare opzionale vincolante in modo che il println viene invocato solo quando v'è un valore effettivo per stampare

func getApple(appleId: String) { 
    if let apples = userDefaults.dictionaryForKey("apples_array") { 
     println(apples[appleId]) 
    } 
} 
Problemi correlati