Swift中compactMap为何返回含nil的数组?类型声明差异的疑问
问题解析:compactMap为何未过滤nil值
核心原因:数组元素类型定义决定了compactMap的行为
先明确compactMap的核心逻辑:当闭包返回Optional类型,且数组元素类型是该Optional的底层非Optional类型时,compactMap才会自动过滤闭包返回的nil,同时解包非nil的Optional值。
分情况拆解代码
情况1:声明数组类型为[Int?]
代码:
let numbers: [String?] = ["1", "two", nil] let intArray: [Int?] = numbers.compactMap {Int($0 ?? "0")} print(intArray) // 输出:[Optional(1), nil, Optional(0)]
- 闭包
Int($0 ?? "0")的返回值是Int?:- 处理"1"时,得到
Optional(1) - 处理"two"时,得到
nil - 处理
nil时,得到Optional(0)
- 处理"1"时,得到
- 你指定了数组类型为
[Int?],此时闭包返回的Int?被当成数组的普通元素类型(数组元素本身就是Optional)。compactMap不会对这些元素做过滤——它认为你就是要收集Int?类型的元素,因此直接保留所有闭包返回值,包括nil。
情况2:声明数组类型为[Int]
代码:
let numbers: [String?] = ["1", "two", nil] let intArray: [Int] = numbers.compactMap {Int($0 ?? "0")} // 输出:[1, 0]
- 此时数组元素类型是
Int(非Optional),闭包返回的Int?和数组类型匹配“Optional→非Optional”的关系。compactMap会自动过滤闭包返回的nil,同时把非nil的Optional(Int)解包成Int,最终得到不含nil的数组。
一句话总结
compactMap的过滤逻辑仅在「闭包返回Optional,且数组元素是该Optional的底层非Optional类型」时触发。如果数组元素本身就是Optional,compactMap会把闭包返回的Optional当作普通元素保留。
内容的提问来源于stack exchange,提问作者Kex
相关产品推荐
相关产品推荐

