2015-10-17 111 views
2

什麼是初始化CBCentralManager實例的好方法,CBCentralManager需要委託並且通常指向擁有的類?如何在需要自引用時在Swift中初始化CBCentralManager

我可以聲明該屬性是一個隱式解包可選,但這樣做,因爲一般的做法似乎並不像Swift一樣,也不是很安全。

或者,我可以聲明該屬性爲可選項。但是由於CBCentralManager的初始化器沒有聲明爲failable,因此聲明實例似乎沒有意義。

隱無包裝可選:

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

沒有辦法來初始化不具有默認值,是不可選(其具有的nil默認值)每非lazy屬性在使用前selfinit方法。

如果你總是初始化initcentralManager,你有沒有代碼,這將有可能使nil,我要說的是,CBCentralManager!聲明是一個不錯的選擇。這是隱式解包可選類型的主要目的之一。

這裏是the documentation about implicitly unwrapped optionals摘錄:

有時,它是從程序的結構可選的意志 總是有一個值,之後該值是第一套清晰。在這些情況下, 可用於在每次訪問時刪除和打開可選值 ,因爲可以安全地假定所有時間都有 的值。

這些類型的可選項被定義爲隱含地解包 可選項。通過在 之後放置一個 感嘆號(字符串!)而不是問號(字符串?),您可以編寫一個隱式解包的可選項。

如果程序邏輯確實有可能允許它在某些時候可能被使用。那麼正常的可選類型是合適的選擇。

另外一個可能的選擇是您將centralManager屬性聲明爲a lazy property。如果你這樣做,它將不會被創建,直到你訪問它,但你將能夠參考self並使其成爲非可選項。如果您需要使用該選項,則可以管理是否使用此選項。

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