一尘不染

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

swift

我创建了以下课程

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

阅读 189

收藏
2020-07-07

共1个答案

一尘不染

正如@Wain所说的–这是由于引用类型的性质造成的。实例是一个let常量仅意味着您不能为其分配新的引用–但却没有提及实例本身的实际可变性。

如果将类更改为结构,则将看到行为随 _值_类型的不同,因为更改属性会更改您的实际值Person-因此,如果它是let常量,则无法这样做。但是,我有点怀疑您要构建自己Person的结构,因为不应将两个具有相同名称的人视为同一个人。

如果您只希望在初始化时分配属性(然后在实例的生命周期内对其进行只读),则建议您将它们设置为let常量(而不是将其设置器设为私有)。一旦分配,这将确保您甚至无法在班级内更改它们的值。

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

class Person {
    let firstName: String
    let lastName: String

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

...
2020-07-07