如何在init函数中实例化依赖于self的对象?

时间:2016-10-16 18:37:29

标签: ios swift macos swift3 core-bluetooth

我知道在调用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

1 个答案:

答案 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 ......不要这样做:)