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

标签 swift class constants

我创建了以下类

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/

相关文章:

ios - 通过 UIActivityView 共享时 NSURL 打印两次

swift - 层变换矩阵(CATransform3D 等)但带有 IBDesignable?

c++ - 类成员是另一个类的对象

java - Java中的类初始化过程

ruby-on-rails - 在 Rails 中处理 View 和仅助手常量的最佳方法

ios - 是否可以在 Storyboard 中定义 "generic"unwind segue?

debugging - 麻烦调试 NSTimer

jquery - 使用 jQuery 为页面上的图像等添加类属性?

c++ - 常量成员和运算符=

c++ - 在 C 和 C++ 中使用 const 限定符指向数组的指针