2014-10-03 38 views
0

使用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? 

我理解的想法,因为变量是选项类型它们与零值初始化,并没有引用Person实例。所以以下对我来说很有意义。

reference1 = Person(name: "John Appleseed") 

但是我在做实验,很惊讶地看到我也可以这样做;

reference1 = Person(name: "Johnny Appleseed") 

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

回答

4

你其实不是更改name你现有的Person实例的属性。

你在做什么是创建一个新的Person,并给他起名为“约翰尼”。您老Person名为“约翰”将被自动释放:

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

除非你有其他变量指向“约翰”,该实例将被释放。

引起编译错误:

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

因为你会试图改变使用let定义的属性的值。

1

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