感谢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)
但是,编译器不具备任何此类功能。基本上它说:
发生了什么事?
主题已关闭--->
的副本Nil cannot be assigned to type ()->()?
Swift 3 optional escaping closure parameter
但第一个仍然没有得到解决/未解决,而第二个似乎主要围绕@escaping问题。
本主题的问题是关于() - > ()? =零部分。简单地删除@escaping,如第二个建议,并没有解决问题;它实际上引入了一个新的:
根据另一位同事的建议,问题在@autoclosure的帮助下得以解决。
func someFunction(someParameter: someType, completionClosure: @escaping @autoclosure () -> ()? = nil)
现在它按预期构建/运行。
我没有声称我完全理解@autoclosure如何解决问题(即使在我的同事解释之后和我自己的研究之后;我已经提供了......好......关闭......为什么依靠自动生成一个...),但是现在我被迫继续进行功能开发。我将来的某个时候会回到这里。 与此同时,如果其他人可以照亮它,请随意。