Swift的.first { } != nil语法长写形式及浓缩规则
首先你提供的代码存在两处笔误:方法内的Arrs应该是你声明的数组变量arr,闭包内的comp应该是方法入参compr,修正后逻辑才成立:
private(set) var arr : [Arrs] = [] func isPresent(for compr: Compr) -> Bool { arr.first { compr.id == $0.id } != nil }
完整长写形式
你疑惑的first { }语法本质是Swift数组的first(where:)方法的简化写法,这个方法接收一个返回布尔值的闭包作为参数,会遍历数组返回第一个满足闭包判断条件的元素,没有匹配项就返回nil。完整无语法糖的写法如下:
func isPresent(for compr: Compr) -> Bool { let matchResult = arr.first(where: { (item: Arrs) -> Bool in // 闭包内写匹配规则,返回true代表当前遍历的item符合要求 return compr.id == item.id }) return matchResult != nil }
浓缩简化步骤
从完整写法到你看到的简短形式,依次用到了Swift的四个语法特性:
- 类型推断省略类型声明:因为数组的元素类型已经明确是
Arrs,编译器可以自动推断出闭包的入参类型是Arrs、返回值类型是Bool,不需要手动写类型声明:let matchResult = arr.first(where: { item in return compr.id == item.id }) - 单表达式闭包隐式返回:如果闭包内部只有一行返回值的表达式,可以省略
return关键字,表达式的运算结果直接作为闭包返回值:let matchResult = arr.first(where: { item in compr.id == item.id }) - 闭包参数缩写:Swift允许不用手动给闭包入参命名,直接用
$0指代第一个入参、$1指代第二个入参,以此类推,同时可以省略参数声明和in关键字:let matchResult = arr.first(where: { compr.id == $0.id }) - 尾随闭包语法:如果方法的最后一个参数是闭包类型,可以把闭包移到方法小括号的外面,如果方法只有闭包这一个参数,还可以直接省略小括号:
let matchResult = arr.first { compr.id == $0.id }
最后直接判断这个返回值是不是不等于nil,就得到了你贴的最终精简写法。
内容的提问来源于stack exchange,提问作者bentim
相关产品推荐
相关产品推荐

