无法在派生类的便捷初始值设定项中初始化常量属性

Aar*_*her 10 initialization subclass swift

以下是操场上的示例代码.我不明白的是为什么b子类中的变量必须是var类型而不能是let.有人可以帮我理解吗?

class Base1 {
    init() { }
}

class Sub1: Base1 {
    let b: Int

    override init() {
        super.init()
    }

    convenience init(b: Int) {
        self.b = b  // Cannot assign to property: 'b' is a 'let' constant
        self.init()
    }
}
Run Code Online (Sandbox Code Playgroud)

pau*_*lvs 6

我认为这与子类化的关系较小,而与类初始化程序的关系较大。

错误只说明了一半,b从更改letvar会显示此类的其他问题:

  • 初始化程序必须为该类的每个存储属性设置一个初始值。如果覆盖init,则必须提供的默认值b

  • 便利初始化程序必须在访问之前调用指定的初始化程序 self

这是它的外观(感谢马丁·R代表就如何保持意见提出的改进blet常数):

class Base1 {
    init() { }
}

class Sub1: Base1 {
    let b: Int

    convenience override init() {
        self.init(b: 5)
    }

    init(b: Int) {
        self.b = b
        super.init()
    }
}

let one = Sub1(b: 10)
one.b   // prints 10
let two = Sub1()
two.b   // prints 5
Run Code Online (Sandbox Code Playgroud)

  • 更好:将“ init(b:Int)”指定为指定的初始值设定项,将“ init()”设为便利的初始值设定项(调用“ self.init(b:5)”)。–然后可以将“ b”保持为常数。 (7认同)