适用于Swift 1.2及以上版本的更新
不幸的是,似乎不再可能将bluetoothManager
作为常量。从Swift 1.2开始,在初始化器中,常量属性只能分配一次值。这不允许我们通过将其声明为可选项以nil
值开始,并在初始化过程中稍后更改它。以下是使用bluetoothManager
作为变量的更新版本。
(注意:保留原文中的html标签,不进行解释)
class Broadcaster: NSObject, CBPeripheralManagerDelegate {
let broadcastID: NSUUID
var bluetoothManager: CBPeripheralManager!
init(broadcastID: NSUUID) {
self.broadcastID = broadcastID
super.init()
let options: Dictionary<String, AnyObject> = [ CBPeripheralManagerOptionShowPowerAlertKey: true ]
self.bluetoothManager = CBPeripheralManager(delegate: self, queue: nil, options: options)
}
}
原始回答
您可以在这里使用隐式解析可选项(对于bluetoothManager
),并在super.init()
之后将值分配给它:
class Broadcaster: NSObject, CBPeripheralManagerDelegate {
let broadcastID: NSUUID
let bluetoothManager: CBPeripheralManager!
init(broadcastID: NSUUID) {
self.broadcastID = broadcastID
super.init()
let options: Dictionary<NSString, AnyObject> = [ CBPeripheralManagerOptionShowPowerAlertKey: true ]
self.bluetoothManager = CBPeripheralManager(delegate: self, queue: nil, options: options)
}
}
因为`bluetoothManager`是可选的,所以在调用`super.init()`时,所有属性都已经初始化完成(`bluetoothManager`会被隐式初始化为`nil`)。但是因为我们知道,在类初始化后,`bluetoothManager`一定会有值,所以我们将其声明为明确解包的选项类型,以避免在使用时进行检查。
更新:
一个属性可以被声明为常量,但仍然可以在初始化程序中更改。只需确保它在初始化完成时具有确定的值即可。这在Swift书的“修改初始化期间的常量属性”章节中有记录。
需要将属性初始化为从尚未完全初始化的对象传递self的调用的情况,在“Unowned References and Implicitly Unwrapped Optional Properties”章节中有描述。