SwiftLint multiple_closures_with_trailing_closure 报错原因解析
报错触发原因
multiple_closures_with_trailing_closure 规则的核心检测逻辑是:当调用一个方法时,如果你同时传入多个闭包字面量,且对最后一个闭包使用了尾随闭包语法,就会触发报错。
你给出的示例刚好符合触发条件,原始代码如下:
Button(action: {self.startTimer.toggle()}) { ...trailing closure }
SwiftUI 的 Button 初始化器本身接收两个闭包类型的参数:
- 第一个是点击事件触发的
action闭包 - 第二个是定义按钮UI内容的
label闭包
上述代码中,action参数传的是当场写的闭包字面量{self.startTimer.toggle()},同时把label闭包以尾随语法写在小括号外侧,相当于同时给方法传入了两个闭包字面量,自然触发了规则检查。
替换为方法后报错消失的原因
当你定义了预定义方法:
func toggleTimer() { self.startTimer.toggle() }
再把 action 的入参换成 toggleTimer 方法引用后,调用 Button 时仅传入了1个闭包字面量(也就是尾部的 label 闭包),不符合「多个闭包参数使用尾随语法」的触发条件,因此Lint报错消失。
规则设计初衷
这条规则本质是为了避免代码可读性问题:在Swift还不支持多尾随闭包语法的时期,仅对多个闭包中的最后一个用尾随语法,很容易让阅读者分不清闭包对应的参数位置,因此才加入了这条禁用规则。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

