如何将[弱自]应用于swift函数(不是闭合)。

问题描述 投票:0回答:2

假设我有一个网络函数,它有一个完成,我在我的消费者中多次使用它,像这样。

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 作为 weakhandleData 功能。

这个问题可以很容易地通过改变 handleData 拟做 closure 像这样。

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

所以我的问题是: 有没有一种方法可以应用于: weak self 对于 功能 而不仅仅是一个闭包?

ios swift closures weak-references
2个回答
0
投票

你可以这样做,如果你想使用 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
    }
}

还有,你不需要提供 -> () 的函数,不返回任何内容。


0
投票

考虑到 handleData 可真大,怎么样

func myFunc() {
    Network.getNumber { [weak self] i in self?.handleData(i) }
}
© www.soinside.com 2019 - 2024. All rights reserved.