【问题标题】:Changing the value of a constant in a class更改类中常量的值
【发布时间】:2014-10-03 14:14:06
【问题描述】:

阅读 Apple 的 Swift Programming Guide 我在 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")

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

【问题讨论】:

    标签: ios xcode macos swift


    【解决方案1】:

    您实际上并没有更改现有 Person 实例的 name 属性。

    您正在做的是创建一个 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 定义的属性的值。

    【讨论】:

      【解决方案2】:

      通过调用Person(name: "Johnny Appleseed"),您将创建一个新的Person 对象来替换reference1 引用的旧Person 对象。旧的 Person 对象的常量属性name 完全没有改变,因此没有报错。

      【讨论】:

        猜你喜欢
        • 2019-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-18
        相关资源
        最近更新 更多