Swift中对象内Double转入另一对象时转字符串的问题求助
解决Swift字典中Double转AnyObject时被转为字符串的问题
这个问题的核心是Swift类型与Objective-C类型桥接时的行为差异:当你把Swift的[String: Any]字典强制转换为AnyObject(本质是桥接为NSDictionary)时,原生的Double值可能被意外转换为NSString,导致输出带引号。下面是几种可行的解决方案:
方案1:改用Foundation的NSDictionary存储对象
直接使用Objective-C的NSDictionary来创建你的对象,它会正确将Double包装为NSNumber类型,避免桥接时的类型转换问题:
var list: [String: AnyObject] = [:] // 用NSDictionary初始化,自动处理数值类型的桥接 let obj = NSDictionary(dictionary: [ "pi": 3.14, "test": "hello" ]) list["firstObj"] = obj print(list) // 输出:["firstObj": { pi = 3.14; test = hello; }]
方案2:使用纯Swift嵌套字典类型(推荐)
如果不需要兼容Objective-C代码,完全可以放弃AnyObject的使用,直接用Swift的嵌套字典类型,这样类型更安全,也不会有桥接问题:
// 定义为[String: [String: Any]]类型,不需要AnyObject var list: [String: [String: Any]] = [:] var obj: [String: Any] = [:] obj["pi"] = 3.14 obj["test"] = "hello" list["firstObj"] = obj print(list) // 输出:["firstObj": ["pi": 3.14, "test": "hello"]]
方案3:显式将Double包装为NSNumber
如果你必须保留AnyObject的类型,可以显式把Double包装成NSNumber,确保桥接时不会被转为字符串:
var list: [String: AnyObject] = [:] var obj: [String: Any] = [:] // 显式用NSNumber包装Double值 obj["pi"] = NSNumber(value: 3.14) obj["test"] = "hello" list["firstObj"] = obj as AnyObject print(list) // 输出:["firstObj": { pi = 3.14; test = hello; }]
原因解释
Swift的原生数值类型(如Double)在桥接到Objective-C时,理论上会自动转为NSNumber,但当你通过as AnyObject把Swift字典[String: Any]转为NSDictionary时,某些场景下Swift的类型推断可能会把Double错误地桥接为NSString。通过上面的方法,我们可以强制数值类型以NSNumber的形式存储,从而保持其数值特性,符合数据库的规则要求。
内容的提问来源于stack exchange,提问作者Moaz Khan
相关产品推荐
相关产品推荐

