我创建了以下课程
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
john.firstName = "John" print(john.firstName) // -> John
正如@Wain所说的–这是由于引用类型的性质造成的。实例是一个let常量仅意味着您不能为其分配新的引用–但却没有提及实例本身的实际可变性。
let
如果将类更改为结构,则将看到行为随 _值_类型的不同,因为更改属性会更改您的实际值Person-因此,如果它是let常量,则无法这样做。但是,我有点怀疑您要构建自己Person的结构,因为不应将两个具有相同名称的人视为同一个人。
Person
如果您只希望在初始化时分配属性(然后在实例的生命周期内对其进行只读),则建议您将它们设置为let常量(而不是将其设置器设为私有)。一旦分配,这将确保您甚至无法在班级内更改它们的值。
规则是,只要在super.init()调用之前为属性赋予一个值–您就可以使其成为let常数(在这种情况下,只需在使用之前在初始化程序中分配它们self)即可。
super.init()
self
class Person { let firstName: String let lastName: String init(firstName: String, lastName: String) { self.firstName = firstName self.lastName = lastName } ...