You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:27:03