如何在需要自引用时在Swift中初始化CBCentralManager

时间:2015-10-17 16:39:23

标签: swift2 initializer

有什么好方法可以初始化CBCentralManager的实例,它需要一个委托并经常指向拥有的类?

我可以将该属性声明为一个隐式解包的可选项,但这样做是一般的做法,而不是像Swift一样,不太安全。

或者,我可以将该属性声明为可选属性。但由于CBCentralManager的初始值设定项未被声明为可用,因此将实例声明为无意义似乎没有意义。

隐式解包可选:

class MyUnwrappedOptional: NSObject, CBCentralManagerDelegate {
    var centralManager: CBCentralManager! 

    func init() {
        super.init()

        centralManager = CBCentralManager(delegate: self, queue: nil, options:nil)

        // Subsequent usages of centralManager in other methods of this class don't require additional unwrapping.
        centralManager.scanForPeripheralsWithServices(services, options: nil)       
    }
}

使用可选:

class MyOptionalClass: NSObject, CBCentralManagerDelegate {
    var centralManager: CBCentralManager?

    func init() {
        super.init()

        centralManager = CBCentralManager(delegate: self, queue: nil, options:nil)

        // Subsequent usages of centralManager in other methods of this class require optional checks:
        if let central = centralManager {
            central.scanForPeripheralsWithServices(services, options: nil)      
        }

        // :: or ::
        central!.scanForPeripheralsWithServices(services, options: nil)
    }
}

这些中的任何一个是更优先的还是有另一种方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

在初始化每个非self属性之前,无法在init方法中使用lazy,该属性没有默认值且不是可选的(默认值为nil)。

如果您始终在centralManager中初始化init,并且您没有可能使其成为nil的代码,我会说CBCentralManager!声明是一个不错的选择。这是隐式展开的可选类型的主要目的之一。

以下摘自the documentation about implicitly unwrapped optionals

  

有时从程序的结构中可以明确看出一个可选的意愿   在首次设置该值之后,始终有一个值。在这些情况下,它   有助于删除检查和解包可选值的需要   每次访问它,因为它可以安全地假设有一个   一直都很重要。

     

这些类型的选项被定义为隐式展开   选配。你通过放置一个隐式解包的可选项来编写   感叹号(String!)而不是问号(String?)之后   您想要选择的类型。

如果程序逻辑在可能使用它的某个时刻确实允许它nil。那么正常的可选类型是合适的选择。

另一种可能的选择是您将centralManager属性声明为a lazy property。如果您这样做,则在访问它之前不会创建它,但您可以引用self并使其成为非可选项。如果您需要使用此选项,则需要创建它时。

lazy var centralManager: CBCentralManager = { [unowned self] () -> CBCentralManager in
    CBCentralManager.init(delegate: self, queue: nil, options: [:])
}()