Swift-在闭包类型上调用.init

时间:2019-07-04 07:12:18

标签: swift

这没有任何实际应用,但今天让我感到惊讶,我想了解它为什么起作用。

这实际上是有效的代码:

var test: ((Bool) -> ())?

test = .init({a in print(a)})

但这不是

test = ((Bool) -> ()).init({a in print(a)})

原因是“类型'(Bool)->()'没有成员'init'”

为什么一个例子有效?初始化调用实际上属于什么?

1 个答案:

答案 0 :(得分:3)

test可选闭包,并且

test = .init({a in print(a)})

调用init的{​​{1}}方法,而不是闭包类型。它是“implicit member expression”,因为类型是从左侧推断出来的。如果您在Xcode源代码编辑器中按住Option键单击Optional调用,这也很明显:

enter image description here

等同于两者

.init

或者只是

test = Optional.init({a in print(a)})
test = Optional({a in print(a)})

因为必要时编译器会自动将test = {a in print(a)} 类型的表达式包装到T中。