更改类中常量的值

时间:2014-10-03 14:14:06

标签: ios xcode macos swift

使用Apple的Swift编程指南我在ARC的解释中遇到了这个例子;

class Person {
    let name: String
    init(name: String) {
        self.name = name
        println("\(name) is being initialized")
    }
    deinit {
        println("\(name) is being deinitialized")
    }
}

var reference1: Person?
var reference2: Person?
var reference3: Person?

我理解这样的想法,因为变量属于选项类型,所以它们的初始值为nil,并且不引用Person实例。所以以下内容对我有意义;

reference1 = Person(name: "John Appleseed")

然而,我正在尝试并且惊讶地发现我也可以这样做;

reference1 = Person(name: "Johnny Appleseed")

我期待代码出错,因为我试图更改常量" name"属性。我不仅可以更改此属性我还收到了消息" Johnny Appleseed正在初始化"。如何将常量初始化两次?

2 个答案:

答案 0 :(得分:4)

您实际上正在更改现有name实例的Person属性。

您正在做的是创建 Person,并将其命名为“Johnny”。名为“John”的旧Person将自动解除分配:

reference1 = Person(name: "John Appleseed")
reference1 = Person(name: "Johnny Appleseed") // "John" is now gone.

除非你有一些指向“John”的其他变量,否则该实例将被解除分配。

会导致编译错误:

reference1 = Person(name: "John Appleseed")
reference1.name = "Johnny Appleseed"

因为您尝试更改使用let定义的属性的值。

答案 1 :(得分:1)

通过调用Person(name: "Johnny Appleseed")创建一个新的Person对象来替换reference1引用的旧Person对象。旧Person对象的常量属性name根本不会更改,因此不会发出错误。