Swift嵌套Optional字典按键取值返回nil的解决方法
Swift 嵌套可选字典按键取值返回nil的解决方法
问题原因
你写的items?[0]["locplc_telno"]返回nil,核心是当前数据是多层可选嵌套结构:
- 最外层的数组本身被
Optional包裹 - 数组内字典的value也被
Optional包裹 - 从
[String: Any]类型字典中取出的值默认是Any?类型,没有做显式类型转换的情况下,Swift无法识别多层可选包裹下的实际字符串值,最终返回nil。
正确取值方式
方式1:可选绑定逐层解包(最稳妥,无崩溃风险)
不要用强制解包!,通过可选绑定逐层拆开可选层,同时做类型转换:
if let validItemArray = items, // 解包外层可选数组 let firstEntry = validItemArray.first, // 取数组第一个字典元素 let phoneNumber = firstEntry["locplc_telno"] as? String { // 取值并显式转为String类型 print(phoneNumber) // 控制台输出 054-602-7799 }
方式2:JSON转模型(长期维护更推荐)
如果是做JSON数据解析,不要直接操作字典硬取值,用Codable协议定义匹配的数据模型,可以避免大量可选解包的冗余代码:
// 定义和JSON字段对应的模型 struct PlaceInfo: Codable { let locplc_telno: String } // 解析流程 if let validItemArray = items, let jsonData = try? JSONSerialization.data(withJSONObject: validItemArray), let placeList = try? JSONDecoder().decode([PlaceInfo].self, from: jsonData) { let targetPhone = placeList.first?.locplc_telno ?? "未获取到号码" print(targetPhone) }
注意事项
- 不要为了省事写
items![0]["locplc_telno"]!这类强制解包代码,一旦接口返回的数组为空、字段缺失,会直接触发程序崩溃。 - 从
[String: Any]类型的字典中取明确类型的值时,必须用as? 目标类型做显式类型转换,否则会因为类型不匹配拿到nil。
内容的提问来源于stack exchange,提问作者077tech
相关产品推荐
相关产品推荐

