关于带闭包的Swift结构体初始化语法的疑问求解
问题解答
语法官方名称
你疑惑的这种写法是两种Swift特性的结合:结构体自动成员逐一构造器 + 尾随闭包语法。
具体实现逻辑
1. 自动成员逐一构造器的生成
Swift中没有自定义构造器的结构体,会自动生成对应所有存储属性的逐一构造器。你定义的Effect<T>结构体只有一个run存储属性,类型为(@escaping (T) -> Void) -> Void,所以编译器自动生成的构造器为:
init(run: (@escaping (T) -> Void) -> Void)
2. 尾随闭包语法的应用
Swift规定,如果函数/构造器的最后一个参数是闭包类型,可以将闭包参数移到参数括号的外部书写;如果该闭包是唯一的参数,甚至可以直接省略参数括号。
你疑惑的代码就是省略了参数括号的尾随闭包写法,完全等价于没有语法糖的版本:
let anIntInTwoSeconds = Effect<Int>(run: { callback in DispatchQueue.main.asyncAfter(deadline: .now() + 2) { callback(42) } })
3. callback的含义
你在闭包开头声明的callback就是run属性要求的入参:它是一个(Int) -> Void类型的函数,这个函数的实际值是你后续调用run方法时传入的闭包。
4. 整体运行流程
- 初始化
anIntInTwoSeconds时,只是把后面的闭包赋值给run属性,不会执行闭包内的延迟逻辑 - 调用
anIntInTwoSeconds.run { theInt in print(theInt) }时,你传入的打印闭包会被当做callback传入之前赋值给run的闭包中 - 触发延迟2秒的逻辑,2秒后执行
callback(42),也就是调用你传入的打印闭包,输出42
内容的提问来源于stack exchange,提问作者Gwalchmei
相关产品推荐
相关产品推荐

