你能有一个同时具有捕获列表和参数列表的闭包吗?

问题描述 投票:0回答:1

在 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
        }
    }
}
swift parameters closures swift2
1个回答
8
投票

您给出的示例确实有效。要指定参数列表和捕获列表,您只需执行以下操作:

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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.