Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了需要在init中设置swift类的所有常量大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个Swift类有一个常量ivar(他们现在称为实例常量?)。要将值设置为此常量,我需要调用所需对象的初始化器并传递自身。但是,我不允许,因为我需要首先初始化所有的值,然后调用super.init(),然后我被允许访问自我。那么在这种情况下做什么? class Broadcaster: NSObject, CBPeripheralManagerDelegate { let broad
我有一个Swift类有一个常量ivar(他们现在称为实例常量?)。要将值设置为此常量,我需要调用所需对象的初始化器并传递自身。但是,我不允许,因为我需要首先初始化所有的值,然后调用super.init(),然后我被允许访问自我。那么在这种情况下做什么?
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和更高版本的UPDATE

不幸的是,似乎不可能有蓝牙管理器作为一个常数。从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,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,options: options)
    }
}

因为bluetoothManager是可选的,在调用super.init()时,所有属性都被初始化(bluetoothManager是用nil隐式初始化的)。但是因为我们知道bluetoothManager在类初始化之后肯定会有值,所以我们将它声明为显式解包,以避免在使用它时进行检查。

更新

属性可以声明为常量,并且在初始化器中仍然可以更改。只需要确保它在初始化完成时有一个确定的值。这在Swift书的“修改初始化期间的常量属性”一章中有说明。

一个属性需要通过一个调用来初始化的时候,这里self必须从尚未完全初始化的对象传递的情况,在“未知的引用和隐含的解包的可选属性”一章中描述。

大佬总结

以上是大佬教程为你收集整理的需要在init中设置swift类的所有常量全部内容,希望文章能够帮你解决需要在init中设置swift类的所有常量所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: