我的功能有这个签名:
self
现在我想在给定的闭包内逃避func foo(bar: String, @noescape baz: ((String) -> ())? = nil)
。
但是当我尝试这个时:
@noescape may only be applied to parameters of function type
编译器抱怨:
ConcurrentDictionary<..., StrongBox<int>> dict = ...;
Interlocked.Increment(ref dict[...].Value);
是否可以在可选参数中使用它?
答案 0 :(得分:10)
如果您的要求如下:
baz
param是closure
baz
param标有@noescape
(因为您想在闭包代码中省略self
)baz
foo
param
然后您可以使用以下语法
func foo(bar: String, @noescape baz: ((String) -> ()) = { _ in } ) {
}
正如您所看到的,与您的代码的主要区别在于:
baz
不是optional type
(但它是&#34;可选参数&#34;)empty closure
,而非nil
值。根据您的要求,您现在可以将关闭传递给baz
,而无需使用self
class Boo {
let world = "world"
func boo() {
foo("hello") { (something) -> () in
print(world)
}
}
}
您还可以省略baz
param
class Boo {
let world = "world"
func boo() {
foo("hello")
}
}
在下面的评论中,用户TadeasKriz
询问如何将此方法与返回值与Void
不同的闭包使用。
这是解决方案
func foo(bar: String, @noescape baz: ((String) -> (Int)) = { _ in return 0 } ) {
}
这里baz
param确实需要一个带有1个类型为String
的参数和一个类型为Int
的返回值的闭包。
如您所见,我向param添加了一个默认值,一个返回0
的闭包。请注意,永远不会使用默认闭包,因此您可以将0
替换为您想要的任何Int
值。
现在您可以决定是否使用将闭包传递给baz
param
class Boo {
let world = "world"
func boo() {
foo("hello") { (something) -> Int in
print(world)
return 100
}
}
}
或者,您可以完全省略baz
param。
class Boo {
let world = "world"
func boo() {
foo("hello")
}
}