[英]How to apply [weak self] to a swift function (not closure)
假设我有一个网络 function 有一个完成,我在我的消费者中多次使用它,如下所示:
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
}
}
}
为了避免重复代码,我用一个 function 替换闭包,如下所示:
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
}
}
这种方法的问题是我无法在handleData
function中将self
捕获为weak
。
通过将handleData
更改为像这样的closure
,可以轻松避免该问题:
lazy var handleData: (Int) -> () = { [weak self] in
self?.num = $0
}
所以我的问题是:有没有办法为function而不仅仅是一个闭包应用weak self
?
如果你想在它的函数上使用对self
的weak
引用,你可以这样做:
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
}
}
此外,您不必为不返回任何内容的 function 提供-> ()
。
考虑到handleData
可能真的很大,怎么样
func myFunc() {
Network.getNumber { [weak self] i in self?.handleData(i) }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.