SwiftUI新手求教NavigationLink的label参数外置语法原理
问题解答
你看到的这种写法是Swift 5.3 引入的多尾随闭包语法特性,属于Swift原生语法规则,并不是SwiftUI独有的自定义语法。
原理说明
首先我们先看NavigationLink对应构造器的简化定义:
init( @ViewBuilder destination: () -> Destination, @ViewBuilder label: () -> Label )
这个构造器接收两个闭包类型的参数:第一个destination是点击后跳转的目标视图,第二个label是导航链接在列表中显示的内容。
几种等价写法对比
你遇到的写法和下面两种写法完全等价:
- 无语法糖的完整写法,所有参数都放在括号内:
NavigationLink( destination: { SensorView() }, label: { Text("Raspberry Pi Zero") } )
- 旧版单尾随闭包写法(仅能把最后一个闭包参数拿到括号外,省略标签):
NavigationLink(destination: { SensorView() }) { Text("Raspberry Pi Zero") }
多尾随闭包语法允许把多个闭包参数都拿到括号外:第一个闭包对应第一个参数,可以省略参数标签;从第二个闭包开始需要显式标注参数标签,不需要再包裹在小括号内,就形成了你看到的写法,本质还是给NavigationLink的构造器传参,不存在逻辑分离的问题。
适用场景
只要是包含多个闭包类型参数的函数/构造器,都可以使用这种写法,在SwiftUI开发中非常常见,比如Button的常规写法也用了这个特性:
Button { // 点击后执行的逻辑 } label: { Image(systemName: "plus") }
除此之外,带完成回调的动画、带多个操作按钮的Alert、Sheet等场景都可以用多尾随闭包写法提升代码可读性。
内容的提问来源于stack exchange,提问作者MikeDice
相关产品推荐
相关产品推荐

