gpt4 book ai didi

swift - 需要自己在 init 中设置 swift 类的所有常量

转载 作者:IT王子 更新时间:2023-10-29 05:04:59 26 4
gpt4 key购买 nike

我有一个 Swift 类,它有一个常量 ivar(它们现在称为实例常量吗?)。要将值设置为此常量,我需要调用所需对象的初始化程序并传递自身。但是,我不允许这样做,因为我需要先初始化所有值,然后调用 super.init(),然后我才可以访问 self。那么在这种情况下该怎么办呢?

class Broadcaster: NSObject, CBPeripheralManagerDelegate {

let broadcastID: NSUUID
let bluetoothManager: CBPeripheralManager

init(broadcastID: NSUUID) {
self.broadcastID = broadcastID

let options: Dictionary<NSString, AnyObject> = [ CBPeripheralManagerOptionShowPowerAlertKey: true ]
self.bluetoothManager = CBPeripheralManager(delegate: self, queue: nil, options: options) // error: 'self' used before super.init call

super.init()
}
}

最佳答案

更新 Swift 1.2 及更高版本

不幸的是,似乎不再可能将 bluetoothManager 作为常量。从 Swift 1.2 开始,在初始化器中,常量属性只能赋值一次。这不允许我们通过将其声明为可选值来从 nil 值开始,并在稍后的初始化过程中更改它。这是将 bluetoothManager 作为变量的更新版本。

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。

关于swift - 需要自己在 init 中设置 swift 类的所有常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24218581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com