假设我有一个网络函数,它有一个完成,我在我的消费者中多次使用它,像这样。
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
对于 功能 而不仅仅是一个闭包?
你可以这样做,如果你想使用 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) }
}