如何使用这样的闭包参数初始化结构?

How can you initialize a struct with a closure parameter like this?

我今天看到它定义了一个结构 Effect 有一个 属性 run 这是一个接受通用参数的闭包:

struct Effect<T> {
    let run: (@escaping (T) -> Void) -> Void
}

然后示例代码创建 Effect<Int> 的实例,并使用类似于尾随闭包语法的内容为 run 属性 指定闭包:

let anIntInTwoSeconds = Effect<Int> { callback in
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        callback(42)
    }
}

是什么让它合法?我希望需要在对 init 方法的调用中明确指定 运行 参数:

let anIntInTwoSeconds = Effect<Int>(run: { callback in
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        callback(42)
    }
}
)

任一版本均可编译并运行。 Swift 中的什么使第一个版本合法?我不知道如何构建问题以便搜索答案。

这就像最后一个参数是函数的任何函数一样工作。尾随闭包语法是尾随闭包语法。该函数是初始化程序这一事实没有改变。

所以让我分阶段完成它。你知道你可以说:

func myfunc(whatever: () -> ()) {}
myfunc {}

好的,但现在让我们将其设为静态方法:

struct S {
    static func myfunc(whatever: () -> ()) {}
}
S.myfunc {}

好的,但是init 一个静态方法——它只是一个允许省略名称的静态方法:

struct S {
    let whatever: () -> ()
}
S {} // meaning S.init {}