我创建了以下类
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/