2015-10-17 4 views
2

Каковы хорошие способы инициализации экземпляра CBCentralManager, который требует делегата и часто указывает на собственный класс?Как инициализировать CBCentralManager в Swift, когда необходима самостоятельная ссылка

Я могу объявить свойство как неявно развернутое необязательное, но это делается, поскольку общая практика кажется скорее не похожей на 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

Там нет никакого способа использовать self в init методе до инициализации каждого не- lazy свойства, которое не имеет значения по умолчанию и не является обязательным (которые имеют значение по умолчанию nil).

Если вы всегда инициализировать в initcentralManager, и у вас нет кода, который будет потенциально сделать его 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: [:]) 
}() 
Смежные вопросы