我注意到编译器不允许我用另一个存储值重写存储属性(这似乎很奇怪):

class Jedi {
    var lightSaberColor = "Blue"
}


class Sith: Jedi {
    override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}

但是,我可以使用计算(computed)属性执行此操作:

class Jedi {
    let lightSaberColor = "Blue"
}


class Sith: Jedi {
    override var lightSaberColor : String{return "Red"}

}

为什么我不能赋予它另一个价值?

为什么用存储的财产进行覆盖是一种可憎的行为,而用计算出的犹太洁食呢?他们在想什么?

推荐答案

为什么我不能赋予它另一个价值?

你绝对可以给继承的财产赋予不同的价值.如果在接受该初始值的构造函数中初始化属性,并从派生类传递不同的值,则可以执行此操作:

class Jedi {
    // I made lightSaberColor read-only; you can make it writable if you prefer.
    let lightSaberColor : String
    init(_ lsc : String = "Blue") {
        lightSaberColor = lsc;
    }
}

class Sith : Jedi {
    init() {
        super.init("Red")
    }
}

let j1 = Jedi()
let j2 = Sith()

println(j1.lightSaberColor)
println(j2.lightSaberColor)

重写一个属性并不等同于给它一个新值——它更像是给一个类一个不同的属性.事实上,重写计算(computed)属性时会发生这种情况:基类中计算(computed)属性的代码是replaced,派生类中计算该属性重写的代码是replaced.

[是否]可以覆盖实际存储的属性,即具有其他行为的lightSaberColor

除了观察者之外,存储的属性没有行为,因此实际上没有什么可以覆盖的.通过上述机制,可以为属性赋予不同的值.这正是问题中的示例试图实现的,使用了不同的语法.

Swift相关问答推荐

WWDC Swift并发会话中的厨房服务示例令人困惑

Form中的Divider在macOS上并不完全扩展

使用SWIFT宏从另一个枚举添加 case

SWIFT并发:合并Taskgroup和AsyncStream?

有没有一种方法可以迭代可编码的代码(例如,JSON解析中的每一项)?

如何让ScrollView缩小到合适的大小,并在没有黑客攻击的情况下占用最小空间

如何将函数参数(字符串文字)标记为可本地化?

Swift ui 转换无法按预期工作

子视图未在父视图 SwiftUI 中触发禁用状态更新

Firebase removeObserver 在 Swift 5 中不起作用

防止带有背景的文本扩展到 maxWidth

如果 Swift 无法分配内存会怎样?

如何让动画变慢 SwiftUI

在 SwiftUI 中,如何在 UIView 内或作为 UIView 使用 UIHostingController?

如果没有标记,则为 Swift 预处理器

AES 加密和解密

如何在 SwiftUI 中实现 PageView?

否定 #available 语句

如何在 SwiftUI 中创建带有图像的按钮?

Swift中方法的弃用和其他属性,如何?