Swift中String转Double前如何检查nil及可选绑定报错处理
问题原因
- 你写的
if let someItem = value as? String已经完成了类型转换和解包,此时someItem是确定的非可选String类型,不需要也不能再次用if let解包,这就是报错的直接原因。 - String转Double的初始化方法
Double(_ string: String)本身返回的就是Double?可选类型,转换失败就返回nil,你应该直接对这个返回值做可选绑定,转换成功才累加。
另外你提供的代码还有一处笔误:处理Double类型的分支里,累加的变量写错成了total,应该是你定义的total2。
修复后的完整代码
var dictionary: [String: Any] = ["Apples": 5, "LightIsOn": false, "Score": 16.3, "IsBusy": true, "Book": "Hamlet", "PageCount": "120"] for (key, value) in dictionary { print("Key: \(key); Value: \(value)") } var total2: Double = 0 for (key, value) in dictionary { if let someItem = value as? Int { total2 += Double(someItem) } else if let someItem = value as? Double { total2 += someItem } else if let someItem = value as? String { // 直接对Double初始化的可选结果做绑定,转换成功才累加 if let num = Double(someItem) { total2 += num } } // 布尔值没有匹配的分支,自动忽略,符合需求 } print("总和是:\(total2)")
结果说明
上述测试字典里的有效可累加项:
- Apples的5转为Double是5.0
- Score的16.3直接累加
- PageCount的"120"转Double成功是120.0
总和为5+16.3+120 = 141.3,布尔值和无法转数字的字符串"Hamlet"都会被忽略,完全符合需求。
内容的提问来源于stack exchange,提问作者Ihor Melashchenko
相关产品推荐
相关产品推荐

