>假设我有一个补全的网络函数,我在我的消费者中多次使用它,如下所示:
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) }
}