这没有任何实际应用,但今天让我感到惊讶,我想了解它为什么起作用。
这实际上是有效的代码:
var test: ((Bool) -> ())?
test = .init({a in print(a)})
但这不是
test = ((Bool) -> ()).init({a in print(a)})
原因是“类型'(Bool)->()'没有成员'init'”
为什么一个例子有效?初始化调用实际上属于什么?
答案 0 :(得分:3)
test
是可选闭包,并且
test = .init({a in print(a)})
调用init
的{{1}}方法,而不是闭包类型。它是“implicit member expression”,因为类型是从左侧推断出来的。如果您在Xcode源代码编辑器中按住Option键单击Optional
调用,这也很明显:
等同于两者
.init
或者只是
test = Optional.init({a in print(a)})
test = Optional({a in print(a)})
因为必要时编译器会自动将test = {a in print(a)}
类型的表达式包装到T
中。