gpt4 book ai didi

swift - 为什么我可以更改/重新分配一个从类实例化的常量值

转载 作者:搜寻专家 更新时间:2023-10-31 08:15:21 25 4
gpt4 key购买 nike

我创建了以下类

class Person {
var firstName: String
var lastName: String

init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}


func fullName() -> String {
return "\(firstName) \(lastName)"
}
}

然后我从类中实例化了一个常量值

 let john = Person(firstName: "Johnny", lastName: "Applessed")

问题:为什么我可以改变变量john的内容?不是常数吗?谁能帮我解释一下,非常感谢。

john.firstName = "John"

print(john.firstName) // -> John

最佳答案

作为@Wain has said – 这是由于引用类型的性质。作为 let 常量的实例仅意味着您不能为其分配新的引用——但没有说明实例本身的实际可变性。

如果将类更改为结构,您将看到行为与value 类型有何不同,因为更改属性会更改 Person 的实际值 –因此,如果它是一个 let 常量,您将无法这样做。但是我有点怀疑您是否想让您的 Person 成为一个结构,因为不应将两个同名的人视为同一个人。

如果您只希望在初始化时分配您的属性(然后在实例的生命周期内只读),那么我建议将它们设为 let 常量(而不是将它们的 setter 设为私有(private)).这将确保一旦分配,您甚至不能从类(class)内部更改它们的值。

规则是只要在 super.init() 调用之前给属性赋值——你可以使它成为一个 let 常量(在这种情况下,你只需在使用 self 之前在初始化程序中分配它们即可。

class Person {
let firstName: String
let lastName: String

init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}

...

关于swift - 为什么我可以更改/重新分配一个从类实例化的常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37238691/

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