Swift疑问:可选数组调用map为何与直接调用数组map表现不同?
问题原因解析
这个问题其实是把Swift里**可选类型(Optional)的map和数组(Array)的map**搞混啦!核心差异在于变量的类型:
关键类型差异
d["list"]的类型是[[String: Int]]?(可选数组),而不是你以为的普通数组[[String: Int]]——字典的下标访问返回的都是可选值,因为下标对应的键可能不存在。这直接导致你调用的map方法完全不是同一个!
两种map的行为区别
- 当你写
d["list"].map { item in print("item is \(item)") }时,调用的是Optional的map方法:
这个方法的逻辑是:如果可选值不为nil,就把整个可选值包裹的内容(也就是完整的数组[["a": 1], ["a": 2]])作为参数传给闭包。所以闭包里的item是整个数组,自然打印的是整个数组的内容。 - 而直接调用
[["a": 1], ["a": 2]].map { ... }时,调用的是Array的map方法:
数组的map会遍历数组里的每一个元素,把每个字典(["a":1]、["a":2])依次传给闭包,所以会分别打印这两个字典。
让两者行为一致的解决方法
你需要先对可选数组进行解包,调用数组的map方法,比如两种常见写法:
- 用可选链调用:
d["list"]?.map { item in print("item is \(item)") }
- 先安全解包再操作:
if let list = d["list"] { list.map { item in print("item is \(item)") } }
这样处理后,d["list"]相关的代码就会和直接用数组的代码输出完全一致啦!
内容的提问来源于stack exchange,提问作者Peter R
相关产品推荐
相关产品推荐

