有什么好方法可以初始化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)
}
}
这些中的任何一个是更优先的还是有另一种方法来实现这一目标?
答案 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: [:])
}()