ios - 将具有枚举值的 Swift 字典转换为 NSDictionary

标签 ios objective-c json swift

如果我有一个类型为 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/

相关文章:

javascript - 使用javascript在特定图像后插入文本

ios - 应用程序在点击时立即将某些用户抛出

ios - Firebase 消息传递方法 swizzling 不起作用

ios - 如何获取特定日期的 Facebook 好友生日?

javascript - 如何对数组进行排序并用 HTML 包装每个数组?

发出简单数组的 SQL FOR JSON

ios - 使用转换渲染 UIImageView 作为 CALayer 进行视频编辑

ios - 对 coreData 数组中的真 bool 值求和

objective-c - Cocoa - 为 setAction 传递参数

iphone - iPhone 的 MAC 地址是唯一的,它会改变吗?