我知道在调用 super.init()
之前需要定义所有属性。但是如果一个属性的初始化依赖于 self
呢?在我的例子中,我需要初始化一个具有委托(delegate)的对象,我需要将其设置为 self
。执行此操作的最佳方法是什么?
class MyClass : NSObject {
var centralManager : CBCentralManager
override init() {
super.init()
centralManager = CBCentralManager(delegate: self, queue: nil)
}
}
这是错误的,因为centralManager
没有在super.init
之前初始化。但我也无法更改顺序,因为那样的话我将在 super.init
之前使用 self
。
最佳答案
问题
假设 CBCentralManager
定义如下
protocol CBCentralManagerDelegate { }
class CBCentralManager {
init(delegate: CBCentralManagerDelegate, queue: Any?) {
}
}
解决方案
这就是你应该如何定义你的类
class MyClass: CBCentralManagerDelegate {
lazy var centralManager: CBCentralManager = {
[unowned self] in CBCentralManager(delegate: self, queue: nil)
}()
}
它是如何工作的?
如您所见,我正在使用 lazy
属性来填充 centralManager
属性。
lazy
属性有一个关联的闭包,该闭包在第一次读取 lazy 属性时执行。
由于只有在当前对象初始化后才能读取惰性属性,所以一切正常。
Where's NSObject?
As you can see I removed the inheritance of
MyClass
fromNSObject
. Unless you have a very good reason to inherit fromNSObject
well... don't do it :)
关于ios - 如何在init函数中实例化一个依赖self的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074005/