如何在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 :)