首页 > 解决方案 > 在 swift 中将函数与闭包“弱自我”作为参数传递

问题描述

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

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

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

例如:

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)
    }
}

class Sum {

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

        handler(sum)
    }

}

标签: swiftfunctionclosures

解决方案


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

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

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

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

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


推荐阅读