转换 Swift 到 NSDictionary 的枚举值的字典

发布时间: 2017/3/4 20:30:37
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

如果我有一本字典与类型 Dictionary<String, MyEnum> ,我不能弄清楚如何将其转换为 NSDictionary,所以我可以 serialiaze 它到 JSON 通过 NSJSONSerialize.dataWithJSONObject

编译器告诉我," Dictionary<String, MyEnum> is not convertible to NSDictionary "。我需要与单枚举的字符串值创建一个新的字典吗

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

或有更好的办法吗?

解决方法 1:

NSJSONSerialize和朋友只能处理小的 JSON 本机数据类型对应的 NSObject 儿童 (NSNumber、 NSString、 NSArray、 NSDictionary 和 NSNull) 的子集。 此外,词典只能转换到 NSDictionary 如果键和值是 NSObject 或固有转换为 NSObject (字符串与数值类型)。

以序列化你的字典,你会需要将枚举转换为那些 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) }
官方微信
官方QQ群
31647020