闭包(默认值)为函数参数

时间:2017-04-27 08:39:31

标签: swift swift3 closures default-parameters

感谢Swift的奇迹,我们可以:

func someFunction(someParameter: someType, someOtherParameter: someOtherType)

我们称之为:

someFunction(x, y)

我们也有:

func someFunction(someParameter: someType, someOtherParameter: someOtherType?)

我们可以这样称呼:

someFunc(x, y)

OR

someFunc(x, nil)

然而,那里的nil看起来很“难看”。更不用说我们是否有多个可选参数:它看起来像

someFunc(x, nil, nil, nil,...etc)

...恐怖

所以,我们可以写这个:

func someFunction(someParameter: someType, someOtherParameter: someOtherType? = nil)

现在,我们可以很好地说:

someFunction(x, y)

OR

someFunction(x)

现在......问题:我想要所有上述机制,但“y”必须是一个闭包。 一个dead_simple。没有输入参数,没有返回类型。 () - > ()善良。 我也希望它是可选的(我可以提供它或者我可能不会),并且我希望它用nil初始化,这样如果我没有提供闭包,我就可以完全省略该参数。

所以:我希望能够说出

someFunction(x, { ... }) 

OR

someFunction(x)

为此,我宣布它是这样的:

func someFunction(someParameter: someType, completionClosure: @escaping () -> ()? = nil)

但是,编译器不具备任何此类功能。基本上它说:

enter image description here

发生了什么事?

主题已关闭--->

的副本

Nil cannot be assigned to type ()->()?

Swift 3 optional escaping closure parameter

但第一个仍然没有得到解决/未解决,而第二个似乎主要围绕@escaping问题。

本主题的问题是关于() - > ()? =零部分。简单地删除@escaping,如第二个建议,并没有解决问题;它实际上引入了一个新的:

enter image description here

根据另一位同事的建议,问题在@autoclosure的帮助下得以解决。

func someFunction(someParameter: someType, completionClosure: @escaping @autoclosure () -> ()? = nil)

现在它按预期构建/运行。

我没有声称我完全理解@autoclosure如何解决问题(即使在我的同事解释之后和我自己的研究之后;我已经提供了......好......关闭......为什么依靠自动生成一个...),但是现在我被迫继续进行功能开发。我将来的某个时候会回到这里。 与此同时,如果其他人可以照亮它,请随意。

0 个答案:

没有答案