2014-07-04 28 views
41

Ora so che quando compila rapidamente, crea un NSDictionary, ma i dizionari NSDictionary e Swift hanno una sintassi diversa. C'è un modo (attraverso un ciclo o qualcosa del genere) per convertire un NSDictionary in un dizionario veloce dello stesso tipo per <key, value>?Conversione da NSDictionary a Swift Dictionary

O

C'è un modo per convertire questo a un dizionario Swift invece di NSDictionary?

let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary 
+3

sotto il cofano il _Swift_ 'Dictionary' è li terally un _Obj-C_ 'NSMutableDictionary', puoi colmarli senza pedaggio. – holex

risposta

3

NSDictionary e Dictionary sono praticamente intercambiabili. Quindi non c'è bisogno di, ma sì è possibile:

let jsonDict = (NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary) as Dictionary 
+0

ma all'interno del dizionario sono nsarrays, nsnumbers, nsstrings .... – Chet

+0

Sono cosa? Intercambiabile con le loro controparti? Sì. – Oxcug

+0

Continuo a dover scrivere 'come NSString' ovunque e comunque ti non piace' as String'. Forse perché sto definendo 'jsonDict: [[String: AnyObject]]'? – Chet

26

uso:

let jsonDic = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: &error) as Dictionary<String, AnyObject>; 
+4

Per qualche ragione, non ha funzionato per me. Ciò che ha funzionato per me era 'let b = d come [NSObject: AnyObject]' – Mazyod

+0

Per SWIFT 3 è possibile utilizzare JSONSerialization. – Efren

4

ho trovato risposta da http://www.swift-studies.com/blog/2014/6/6/loading-a-swift-dictionary-from-a-plist-file

var swiftDict : Dictionary<String,AnyObject!> = Dictionary<String,AnyObject!>() 
for key : AnyObject in ocDictionary.allKeys { 
    let stringKey = key as String 
    if let keyValue = ocDictionary.valueForKey(stringKey){ 
     swiftDict[stringKey] = keyValue 
    } 
} 
+1

Forse in alcuni casi molto specifici che possono ripagare, ma non penso che il sovraccarico di memoria, uso della CPU e della batteria di fare una copia superficiale del NSDictionary abbia un reale vantaggio. Poiché è possibile utilizzare un NSDictionary come dizionario normale, la differenza è quasi inesistente. – ncerezo

-4

Basta dichiarare che si tratta di dizionario Swift

var values: [String: AnyObject] = [ 
    "key1": 100, 
    "key2": "meow", 
] 

values["key3"] = 20 
+0

Chiede di cambiare il suo tipo in Swift dal tipo Objective-C, non creando un tipo di dizionario Swift da zero. – santibernaldo

+0

@santibernaldo puoi usare un ciclo for da assegnare dal tipo Objective-C al dizionario Swift – onmyway133