You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:20:10