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

关于带闭包的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:06:03