我的功能有这个签名:
func foo(bar: String,baz: ((String) -> ())? = nil)
而现在我想让自己在给定的关闭中逃脱自我.
但是当我尝试这个:
func foo(bar: String,@noescape baz: ((String) -> ())? = nil)
编译器抱怨:
@noescape may only be applied to parameters of function type
是否可以在可选参数中使用它?
解决方法
要求
如果您的要求如下:
baz param是封闭
> baz param被标记为@noescape(因为你想在关闭代码中省略自己)
>在调用foo时可以省略baz param
解
然后可以使用以下语法
func foo(bar: String,@noescape baz: ((String) -> ()) = { _ in } ) { }
你可以看到与你的代码的主要区别是:
>这里baz不是一个可选类型(但它是一个“可选参数”)
>并且其默认值是一个空的闭包不是一个零值.
例子
如您所要求的,您现在可以将封闭物传递给baz,而无需使用自身
class Boo { let world = "world" func boo() { foo("hello") { (something) -> () in print(world) } } }
你也可以省略baz param
class Boo { let world = "world" func boo() { foo("hello") } }
更新:使用与Void不同的返回类型的闭包
在下面的评论中,用户TadeasKriz询问如何使用这种方法与一个闭包返回值不同Void.
这是解决方案
func foo(bar: String,@noescape baz: ((String) -> (Int)) = { _ in return 0 } ) { }
这里的baz param确实需要一个类型为String的String参数和类型为Int的返回值的闭包.
正如你所看到的,我添加了一个默认值到param,一个闭包确实返回0.请注意,默认的关闭将永远不会被使用,所以你可以用你想要的任何Int值替换0.
现在你可以决定是否使用关闭到baz param
class Boo { let world = "world" func boo() { foo("hello") { (something) -> Int in print(world) return 100 } } }
或者,再次,你可以完全省略巴斯参数.
class Boo { let world = "world" func boo() { foo("hello") } }