gpt4 book ai didi

swift - Swift初始化时常量属性的概念

转载 作者:搜寻专家 更新时间:2023-11-01 07:14:45 24 4
gpt4 key购买 nike

“对于类实例,常量属性只能由引入它的类在初始化期间修改。它不能被子类修改。”摘自: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/

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