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



>假设我有一个补全的网络函数,我在我的消费者中多次使用它,如下所示:

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捕获为handleData函数中的weak

通过将handleData更改为如下所示的closure,可以轻松避免此问题:

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

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

如果你想使用weak引用来self它的函数,你可以这样做:

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

最新更新