【问题标题】:How to instantiate an object that depends on self in the init function?如何在init函数中实例化一个依赖于self的对象?
【发布时间】:2017-02-25 16:57:13
【问题描述】:

我了解在调用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

【问题讨论】:

    标签: ios swift macos swift3 core-bluetooth


    【解决方案1】:

    问题

    假设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 属性有一个关联的闭包,该闭包在第一次读取惰性属性时执行。

    由于只有在当前对象初始化后才能读取惰性属性,所以一切正常。

    NSObject 在哪里?

    如您所见,我从NSObject 中删除了MyClass 的继承。除非你有充分的理由从NSObject 继承...不要这样做:)

    【讨论】:

    • [unowned self] in 是防止强引用循环所必需的。
    • 请告诉我我的回答有什么问题?我只是想知道事情应该如何以正确的方式工作......我认为答案应该有效。谢谢
    • @AhmadF:首先,我没有否决您的回答。但是在我的操场上,您的代码会生成此编译器错误:error: 'self' used before super.init call.
    • @appzYourLife 即使您不是那个人,也可以否决我的答案,但是我想知道问题出在哪里,我以前已经这样做过,而且对我来说效果很好。你认为它与 Swift 版本有关吗?我正在使用 Swift 2。感谢您的回复
    • @AhmadF 但这不是我的问题。您没有使用self 来初始化centralManager。我是。这就是问题所在。
    猜你喜欢
    • 2019-02-16
    • 2014-10-31
    • 2016-10-05
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多