我知道在调用super.init()
之前需要定义所有属性。但是如果属性的初始化取决于self
怎么办?在我的情况下,我需要初始化一个具有委托的对象,我需要将其设置为self
。这样做的最佳方式是什么?
class MyClass : NSObject {
var centralManager : CBCentralManager
override init() {
super.init()
centralManager = CBCentralManager(delegate: self, queue: nil)
}
}
这是错误的,因为centralManager
未在super.init
之前初始化。但我也无法更改订单,因为我会在self
之前使用super.init
。
答案 0 :(得分:2)
假设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属性时执行。
由于只有在初始化当前对象之后才能读取lazy属性,所以一切都会正常工作。
哪里是NSObject?
如您所见,我从
MyClass
删除了NSObject
的继承。除非你有充分的理由继承NSObject
......不要这样做:)