如何在init函数中实例化一个依赖self的对象?
How to instantiate an object that depends on self in the init function?
我了解在调用 super.init()
之前需要定义所有属性。但是如果一个属性的初始化依赖于self
呢?在我的例子中,我需要初始化一个具有委托的对象,我需要将其设置为 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
的方式
class MyClass: CBCentralManagerDelegate {
lazy var centralManager: CBCentralManager = {
[unowned self] in CBCentralManager(delegate: self, queue: nil)
}()
}
它是如何工作的?
如您所见,我正在使用 lazy
属性 来填充 centralManager
属性.
lazy
属性 有一个关联的闭包,它在第一次读取惰性 属性 时执行。
由于只有在当前对象初始化后才能读取惰性属性,所以一切正常。
Where's NSObject?
As you can see I removed the inheritance of MyClass
from NSObject
. Unless you have a very good reason to inherit from NSObject
well... don't do it :)
我了解在调用 super.init()
之前需要定义所有属性。但是如果一个属性的初始化依赖于self
呢?在我的例子中,我需要初始化一个具有委托的对象,我需要将其设置为 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
的方式class MyClass: CBCentralManagerDelegate {
lazy var centralManager: CBCentralManager = {
[unowned self] in CBCentralManager(delegate: self, queue: nil)
}()
}
它是如何工作的?
如您所见,我正在使用 lazy
属性 来填充 centralManager
属性.
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 :)