将可编码对象转换为字典,而无需将布尔转换为NSNumber

时间:2019-12-20 07:04:26

标签: ios swift codable

我有一个Codable对象,我需要将其转换为Dictionary,所以我首先 encoding 将其转换为Data,然后使用{{1 }}将该JSONSerialization转换为Data,然后使用Any获取字典。

转换成功,但是由于使用as? [String: Any]JSONSerialisation类型正在转换为Bool,但是我想保留{{1 }}

NSNumber

输出

  

[“元”:{       演示= 1; },“ employeeID”:1]

demo 属性正在转换为Bool,但我想保留Dictionary

2 个答案:

答案 0 :(得分:0)

print的输出具有误导性。这与到NSDictionary

的内部隐式桥接有关

尽管该值显示为1,但类型为布尔值,请参见

let meta = dictionary!["meta"] as! [String:Any]
print(type(of: meta["demo"]! )) // __NSCFBoolean

您的担心是没有原因的,因为要从[String:Any]字典中获取值,您仍然必须强制转换类型

let demo = meta[demo] as! Bool

或者您必须将字典转换为[String:Bool]

let meta = dictionary!["meta"] as! [String:Bool]
let demo = meta["demo"]!

旁注:

尽可能声明结构成员为非可选,而不是相反。

答案 1 :(得分:0)

这应该可以解决问题:

struct Meta: Codable {
    let demo: Bool?

    public init(demo : Bool) {
        self.demo = demo
    }

    enum CodingKeys: String, CodingKey {
        case demo = "demo"
    }

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        demo = try container.decode(Bool.self, forKey: .demo)
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(self.demo, forKey: .demo)
    }
}

JSON表示仍然是一个数字,但可以正确解码回Bool。