如何将[弱自我]应用于快速函数(非闭包)

说我有一个具有完成功能的网络功能,我在消费者中多次使用它,如下所示:

class Network {
   func getNumber(completion: @escaping (Int) -> ()) {
      //some network code
      completion(5)
   }
}

class MyClass {
var num = 0
let network = Network()

func myFunc() {
    network.getNumber { [weak self] (number) in
        self?.num = number
    }
}

func myFunc2() {
    network.getNumber { [weak self] (number) in
        self?.num = number
    }
}

}

为避免重复的代码,我用一个函数替换了闭包 像这样:

class MyClass {
var num = 0
let network = Network()

func myFunc() {
    network.getNumber(completion: self.handleData)
}

func myFunc2() {
    network.getNumber(completion: self.handleData)
}

func handleData(_ number: Int) -> () {
    self.num = number
}
}

此方法的问题是我无法在self函数中将weak捕获为handleData

通过将handleData更改为closure可以很容易地避免此问题:

lazy var handleData: (Int) -> () = { [weak self] in
    self?.num = $0
}

所以我的问题是:有没有办法将weak self应用于功能而不仅仅是闭包?

iCMS 回答:如何将[弱自我]应用于快速函数(非闭包)

如果要在其功能上使用weakself的引用,可以执行以下操作:

class MyClass {
    var num = 0

    func myFunc() {
        Network.getNumber { [weak self] in
            self?.handleData($0)
        }
    }

    func myFunc2() {
        Network.getNumber { [weak self] in
            self?.handleData($0)
        }
    }

    func handleData(_ number: Int) {
        self.num = number
    }
}

此外,您无需为不返回任何内容的函数提供-> ()

,

考虑到handleData确实很大,

func myFunc() {
    Network.getNumber { [weak self] i in self?.handleData(i) }
}
本文链接:https://www.f2er.com/2205394.html

大家都在问