2014-10-03 40 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根本沒有更改,因此不會發出錯誤。