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

问题描述 投票:-2回答:1

我有一个Codable对象,我需要将其转换为Dictionary,因此我首先encode将其转换为Data,然后使用JSONSerialization将其从Data转换为Any然后使用as? [String: Any]获取字典。

转换成功,但是由于使用了JSONSerialisationBool类型正在转换为NSNumber,但是我想将Bool值保留在Dictionary

import Foundation

struct Employee: Codable {
    let employeeID: Int?
    let meta: Meta?
}

struct Meta: Codable {
    let demo: Bool?
}

let employeeObject = Employee(employeeID: 1, meta: Meta(demo: true))

do {
    let encodedObject = try JSONEncoder().encode(employeeObject)

    let dictionary = try JSONSerialization.jsonObject(with: encodedObject, options: .fragmentsAllowed) as? [String: Any]

    print(dictionary ?? [:])

} catch  {
    print(error)
}

输出

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

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

ios swift codable
1个回答
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"]!
© www.soinside.com 2019 - 2024. All rights reserved.