2014-11-13 36 views
1

如果我有一个Dictionary<String, MyEnum>类型的字典,我不知道如何将其转换为NSDictionary,所以我可以通过NSJSONSerialize.dataWithJSONObject将它串行到JSON。使用枚举值转换Swift字典到NSDictionary

编译器告诉我“Dictionary<String, MyEnum> is not convertible to NSDictionary”。我是否需要创建一个新的字典,其中包含枚举的字符串值?

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

或者还有更好的方法吗?

回答

4

NSJSONSerialize和朋友只能处理对应于JSON本机数据类型的NSObject子项(NSNumber,NSString,NSArray,NSDictionary和NSNull)的小子集。另外,如果键和值都是NSObject或者固有可转换为NSObject(字符串和数字类型),则Dictionary只能转换为NSDictionary。

为了系列化你解释你需要枚举转换为那些NSJSONSerialize数据类型,类似于你的例子之一:

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) 

作为替代方案,因为这种操作是相当常见的,你可能需要考虑增加这一类辞书,这使得它方便map功能:

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) } 
+0

是的,我怀疑是这样。我非常期待本机Swift方法来处理JSON,因为如果这确实是解决方案,那么在处理JSON繁重代码时,我可能不会使用枚举。 – thatidiotguy

+0

对于更一般的用法,我倾向于将NSJSONSerialization包装为依赖于JSONSerializable协议的功能,该协议包含一个将对象转换为JSONSerializable表单的'convertToJson'对象。然后,像你在这里使用的简单枚举可以实现该方法作为'return rawValue' –

+0

啊有趣。这通常是一个很好的方法。然而,我只是将这个问题的一个实例作为一个问题,所以我可能只是摆脱了我的项目中的枚举。无论如何,我并没有做太多的工作,只是习惯于使用Java日子里的枚举。感谢指针,但。 – thatidiotguy