In 这个问题 https://stackoverflow.com/questions/70039118/uncertain-of-this-swift-struct-syntax-with-closure/70039340?noredirect=1#comment123810935_70039340我今天看到它定义了一个结构体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 {}
OK, but init
is静态方法 - 它只是一个静态方法,您可以省略其名称:
struct S {
let whatever: () -> ()
}
S {} // meaning S.init {}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)