你能有一个既有捕获列表又有参数列表的闭包吗?
Can you have a closure that has both capture list and parameter list?
在Swift中,如何创建一个既有捕获列表又有参数的闭包?
我使用过两种形式的代码,但不知道如何创建同时具有参数和捕获列表的闭包。
例如
带参数列表的闭包:
myFunction {
(x: Int, y: Int) -> Int in
return x + y
}
使用捕获列表关闭:
myFunction { [weak parent = self.parent] in print(parent!.title) }
使用捕获列表的示例尝试:
class MyTest {
var value:Int = 3
func myFunction(f: (x:Int, y:Int) -> Int) {
print(f(x: self.value, y: 5))
}
func testFunction() {
myFunction {
[weak self] (x, y) in //<--- This won't work, how to specify weak self here?
print(self.value)
return self.value + y
}
}
}
您给出的示例确实有效。要同时指定参数列表和捕获列表,您只需执行以下操作:
exampleFunctionThatTakesClosure() { [weak self] thing1, thing2 in
}
但是,通过参数列表创建弱引用意味着闭包中的 self
成为可选的 - 因此,您必须解包(或强制解包)它才能使用它的值。
例如,强制展开:
func testFunction() {
myFunction {
[weak self] (x, y) in
print(self!.value)
return self!.value + y
}
}
或者:
func testFunction() {
myFunction {
[weak self] (x, y) in
if let weakSelf = self {
print(weakSelf.value)
return weakSelf.value + y
} else {
return y
}
}
}
在Swift中,如何创建一个既有捕获列表又有参数的闭包?
我使用过两种形式的代码,但不知道如何创建同时具有参数和捕获列表的闭包。
例如
带参数列表的闭包:
myFunction {
(x: Int, y: Int) -> Int in
return x + y
}
使用捕获列表关闭:
myFunction { [weak parent = self.parent] in print(parent!.title) }
使用捕获列表的示例尝试:
class MyTest {
var value:Int = 3
func myFunction(f: (x:Int, y:Int) -> Int) {
print(f(x: self.value, y: 5))
}
func testFunction() {
myFunction {
[weak self] (x, y) in //<--- This won't work, how to specify weak self here?
print(self.value)
return self.value + y
}
}
}
您给出的示例确实有效。要同时指定参数列表和捕获列表,您只需执行以下操作:
exampleFunctionThatTakesClosure() { [weak self] thing1, thing2 in
}
但是,通过参数列表创建弱引用意味着闭包中的 self
成为可选的 - 因此,您必须解包(或强制解包)它才能使用它的值。
例如,强制展开:
func testFunction() {
myFunction {
[weak self] (x, y) in
print(self!.value)
return self!.value + y
}
}
或者:
func testFunction() {
myFunction {
[weak self] (x, y) in
if let weakSelf = self {
print(weakSelf.value)
return weakSelf.value + y
} else {
return y
}
}
}