2014-07-04 3 views
41

Теперь я знаю, что когда быстрая компиляция просто делает NSDictionary, но словаря NSDictionary и Swift имеют разный синтаксис. Есть ли способ (через цикл или что-то) преобразовать NSDictionary в быстрый словарь того же типа для <key, value>?Convert NSDictionary to Swift Dictionary

ИЛИ

Есть ли способ, чтобы преобразовать это Swift словарь вместо NSDictionary?

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

под капотом _Swift_ 'Словарь' является ли terally _Obj-C_ 'NSMutableDictionary', вы можете скрыть их бесплатно. – holex

ответ

3

NSDictionary и Dictionary довольно много взаимозаменяемы. Таким образом, нет никакой необходимости, но да, вы можете:

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

, но в словаре есть nsarrays, nsnumbers, nsstrings .... – Chet

+0

Это они? Взаимозаменяемы со своими коллегами? Да. – Oxcug

+0

Мне все равно приходится набирать 'как NSString' всюду, а ti не нравится' as String'. Может быть, это потому, что я определяю 'jsonDict: [[String: AnyObject]]'? – Chet

26

использование:

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

По какой-то причине это не сработало для меня. Для меня работала «let b = d as [NSObject: AnyObject]» – Mazyod

+0

Для SWIFT 3 вы можете использовать JSONSerialization. – Efren

4

Я нашел ответ от 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

Возможно, в некоторых очень конкретных случаях, которые могут окупиться, но я не думаю, что накладные расходы в памяти, процессор и использование батареи для создания мелкой копии NSDictionary имеют какое-то реальное преимущество. Поскольку вы можете использовать NSDictionary как обычный словарь, разница почти не существует. – ncerezo

-4

Просто заявить, что Swift словарь

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

values["key3"] = 20 
+0

Он спрашивает об изменении своего типа на Swift из Objective-C, не создавая тип словаря Swift с нуля. – santibernaldo

+0

@santibernaldo вы можете использовать цикл for для назначения из этого объекта Objective-C словаря Swift – onmyway133