Swift中为何可通过Location.init(placemark:)在compactMap中省略参数?
关于Swift中compactMap使用构造器引用的疑问
你有一个CLPlacemark类型的数组,发现两段代码都能正常运行,但不理解示例2里为什么不用显式传参数就能创建Location实例,下面来拆解其中的逻辑:
示例1:常规闭包写法
let placemarks: [CLPlacemark] // ... placemarks .compactMap({ placemark in Location(placemark: placemark) })
这段是最直观的写法:通过闭包接收数组里的每个placemark,手动调用Location的构造器创建实例,compactMap会自动过滤掉构造器返回的nil值(如果Location.init(placemark:)是可失败构造器的话)。
示例2:构造器引用写法
let placemarks: [CLPlacemark] // ... placemarks .compactMap(Location.init(placemark:))
这里用到了Swift的构造器引用语法:
Location.init(placemark:)本质上是一个函数,它的类型是(CLPlacemark) -> Location?(对应你的Location可失败构造器,或者返回可选类型的构造逻辑)。- 而
compactMap需要的参数正好是一个(Element) -> ElementOfResult?类型的闭包,这里数组元素是CLPlacemark,所以闭包类型就是(CLPlacemark) -> Location?,和构造器引用的类型完全匹配。 - 当你把构造器引用传给
compactMap时,Swift会自动把数组中的每个CLPlacemark元素作为参数传递给这个构造器,不需要你手动写参数名和传入逻辑,相当于把示例1的闭包逻辑简化成了构造器的直接引用。
简单来说,这不是“无需传入参数”,而是Swift帮你自动完成了参数的传递,把构造器当成符合要求的函数直接传给compactMap使用。
内容的提问来源于stack exchange,提问作者Ariel Antonio Fundora
相关产品推荐
相关产品推荐

