“ 对于类实例,常量属性只能由引入它的类在初始化期间修改。它不能被子类修改。” 摘自:Apple Inc.“The Swift Programming Language (Swift 3.1)”。 iBooks。
我很难理解这一点,因为我也可以通过子类修改属性。 下面是代码。
class ConstantTest {
let constant: String
init(constant: String) {
self.constant = constant
}
func printConstant() {
print(constant)
}
}
let constanttest = ConstantTest(constant: "Hello")
constanttest.printConstant()
class SubConstClass: ConstantTest { }
var subTest = SubConstClass(constant: "hey")
subTest.printConstant()
最佳答案
让您感到困惑的关键是子类初始化常量属性意味着什么。这意味着子类不能引入分配值的初始化程序。让我们考虑一个简单的案例:
class Person {
let name: String
init() {
name = "Alice"
}
}
这可以通过在其声明中分配 name
来更简单地编写,但我希望这更清楚。现在我们要创建一个子类,将 name
分配给其他东西。执行此操作的明显方法(以及如何在没有常量属性的语言中执行此操作)是在调用 super.init()
之后分配它:
class Employee: Person {
override init() {
super.init()
name = "Bob" // error: cannot assign to property: 'name' is a 'let' constant
}
}
没有。我们遇到了您摘录中描述的情况。好吧,也许我们应该先分配它?
class Employee: Person {
override init() {
name = "Bob" // error: cannot assign to property: 'name' is a 'let' constant
super.init()
}
}
没有。没有更好。
啊!这是因为我们调用了 super.init()
。让我们不要调用它。
class Employee: Person {
override init() {
name = "Bob" // error: cannot assign to property: 'name' is a 'let' constant
}
}
不...当他们说你不能这样做时,他们的意思是你不能这样做。您可以探索更多,例如将类更改为:
class Person {
let name = "Alice"
}
你会发现你有所有相同的问题。您不能从子类中引入的方法分配给父类(super class)中的 let
常量。
关于swift - Swift初始化时常量属性的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42796339/