2016-08-21 40 views
3

我無法想象Swift初始化器的工作。這個例子來自官方文檔。瞭解可視化快速初始化器

struct Fahrenheit{ 
    var temp : Double 
    init(){ 
     temp = 32.0 
    } 
} 
var f = Fahrenheit() 
print(" \(f.temp)") 
//Prints 32.0 

這就是我理解到現在爲止,請糾正我,當我錯了:

  1. 結構是值類型。
  2. 變量temp是一個存儲屬性,用於存儲定義該結構的內存空間(在內存中)的值。
  3. 當我們創建一個變量'f'時,結構華氏的一個實例(對象)副本在具有相同屬性的另一個內存空間中創建。

我無法理解什麼是,什麼是

init(){ 
      temp = 32.0 
     } 
  1. 做的實例F。
  2. 我們什麼時候使用初始化器? (主要目的:用一個例子)。
  3. 函數,閉包和初始化程序之間的區別,它們如何存儲在內存中?

回答

3

深入理解對象的創建過程(作爲類的一個實例或結構的一個實例)是非常重要的。對象是基於在類或結構中定義的模板創建的,在我喜歡稱爲「對象空間」的「空間」中。因此,該對象是「對象空間」中的struct Fahrenheit實例,您可以嘗試將其視爲一個氣球。變量f是對這個對象的引用,它被用作訪問這個氣球(對象,實例)的工具。 我建議你看看蘋果的文檔:

https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

在這裏你可以看到這一點:

Suggestion, how to visualize it...

而且 - 在我看來,這是一個很好的辦法如何可視化對象和對象的引用。因此,當系統執行時:var f = Fahrenheit(),首先 - 它在Object空間中產生一個氣球,它調用initialiser(隱式或顯式)來設置初始值,而不是引用(f) - 那指向剛剛出生的對象。

所以:

init(){ 
     temp = 32.0 
    } 

不會對效果 - f時,使效果對象(氣球)內,F是被用來訪問的氣球。 (如果沒有參考,ARC會殺死對象)

+0

所以你說的是,當f對象被創建時,這個對象使用一些內存地址,例如[9000]。 'f'用於引用內存地址[9000]。但我不明白「它在對象(氣球)內部產生效果」。謝謝 ! –

+0

temp的值在對象內。所以,初始化器會在對象內進行更改。它不會在f內進行更改,它會在對象內進行更改 - 即f的原因。 – tosha

+0

所以對象的臨時值基本上更新了? –