如果我有一个类型为 Dictionary<String, MyEnum>
的字典,我不知道如何将它转换为 NSDictionary,所以我可以通过 NSJSONSerialize.dataWithJSONObject
将它序列化为 JSON .
编译器告诉我“Dictionary<String, MyEnum> is not convertible to NSDictionary
”。我是否需要用枚举的字符串值创建一个新字典 a la
var newDict = Dictionary<String, String> (or <String, AnyObject>);
for (key, val) in oldDict {
newDict[key] = val;
}
或者有更好的方法吗?
最佳答案
NSJSONSerialize
和它的 friend 只能处理与 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)
作为替代方案,由于这种操作相当普遍,您可能需要考虑将此类别添加到 Dictionary,这会为其提供方便的 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) }
关于ios - 将具有枚举值的 Swift 字典转换为 NSDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26916092/