在swift中将函数与闭包“弱自我”作为参数传递

Ant*_*ony 7 closures function swift

在很多示例中,人们使用闭包将函数作为参数传递:

sum.getSumOf(array: [1,2,3]) { [weak self] sum in
     self?.result = sum
     print(self?.result as Any)
}
Run Code Online (Sandbox Code Playgroud)

我知道这是为了自行车问题。但是传递一个函数而不是一个闭包呢?如何使这个功能“弱”?

例如:

class Calculator {

    let sum = Sum()
    var result = 0

    // passing a function 

    func doSum() {
        sum.getSumOf(array: [1,2,3], handler: store(sum:))
    }

    // vs use closure

    func doSumWeakSelf() {
        sum.getSumOf(array: [1,2,3]) { [weak self] sum in
            self?.result = sum
            print(self?.result)
        }
    }

    func store(sum:Int){
        result = sum
        print(result)
    }
}
Run Code Online (Sandbox Code Playgroud)

class Sum {

    func getSumOf(array:[Int], handler: ((Int)->Void)) {
        //step 2
        var sum: Int = 0
        for value in array {
            sum += value
        }

        handler(sum)
    }

}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 5

首先,在你的例子中根本不需要weak。没有保留循环,因为处理程序没有转义。它会立即执行并释放。weak在没有保留循环的情况下,您不应该使用。

即使在转义的情况下,也可能并不总是存在一个保留循环,因为闭包最终可能会被释放。@escaping但是,当有注释时,您只能通过文档来真正了解这一点。

也就是说,对于您的具体问题,在此示例中:

func doSum() {
    sum.getSumOf(array: [1,2,3], handler: store(sum:))
}
Run Code Online (Sandbox Code Playgroud)

这会捕获self(因为它是 的隐式参数store(sum:)),并且不可能self使用此语法进行弱化。在这种情况下没关系,因为没有保留循环,但是如果有,如果您选择以这种方式传递方法,则无法解决它。