如何使用这样的闭包参数初始化结构?
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 {}
在 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 {}