将带有枚举值的Swift字典转换为NSDictionary

如果我有一个Dictionary<String, MyEnum>types的Dictionary<String, MyEnum> ,我不知道如何将其转换为一个NSDictionary,所以我可以通过NSJSONSerialize.dataWithJSONObject serialiaze到JSON。

编译器告诉我“ Dictionary<String, MyEnum> is not convertible to NSDictionary ”。 我是否需要用enum a la的string值创build一个新的字典

 var newDict = Dictionary<String, String> (or <String, AnyObject>); for (key, val) in oldDict { newDict[key] = val; } 

或者,还有更好的方法?

NSJSONSerialize和朋友只能处理对应于JSON本机数据types的NSObject子项(NSNumber,NSString,NSArray,NSDictionary和NSNull)的一小部分。 此外,只有当键和值都是NSObject或固有可转换为NSObject(string和数字types)时,才能将Dictionary转换为NSDictionary。

为了序列化您的字典,您需要将Enum转换为其中一个NSJSONSerialize数据types,类似于您的示例:

 enum MyEnum : String { case one = "one" case two = "two" } let dict = ["one":MyEnum.one, "two":MyEnum.two] var newDict = Dictionary<String, String>() for (key, val) in dict { newDict[key] = val.rawValue } let data = NSJSONSerialization.dataWithJSONObject(newDict, options: .allZeros, error: nil) 

另外,由于这种操作相当普遍,您可能需要考虑将此类别添加到Dictionary中,从而为其提供便利的mapfunction:

 extension Dictionary { init(_ pairs: [Element]) { self.init() for (k, v) in pairs { self[k] = v } } func map<K: Hashable, V>(transform: Element -> (K, V)) -> [K: V] { return Dictionary<K, V>(Swift.map(self, transform)) } } 

一旦完成,转换简单:

 let mapped = dict.map { (key, value) in (key, value.rawValue) }