讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 3.1 變量作用域與生命週期 >

3.1 變量作用域與生命週期

回憶一下第1章所講的,變量就是個類型明確的具名盒子。每個變量都必須要顯式聲明。為了將對像放到盒子中,即讓變量名引用該對象,你需要將對像賦給變量(第2章介紹過,函數也有類型,也可以賦給變量)。

除了給引用賦予一個名字,根據所聲明的位置,變量還會對所引用的對象賦予一個特定的作用域(可見性)與生命週期;將某個對象賦給變量可以確保它能被所需的代碼看到,並且持續足夠長的時間來滿足這個目的。

在Swift文件的結構中(參見示例1-1),變量實際上可以在任何地方聲明。不過,區分變量作用域與生命週期的幾個層次還是非常有必要的:

全局變量

全局變量指的是聲明在Swift文件頂層的變量(在示例1-1中,變量one就是個全局變量)。

全局變量的生命週期與文件一樣長。這意味著它會一直存在。不過,說一直存在有點不太嚴格,但只要程序運行時它就會存在。

全局變量在任何地方都是可見的,這正是「全局」一詞的含義。相同文件中的所有代碼都可以看到它;因為它位於頂層,因此相同文件中的任何其他代碼都會位於頂層或是更低的層次,這都是作用域所包含的層次。此外,在默認情況下,相同模塊中的任何其他文件中的代碼也可以看到它,因為同一個模塊中的Swift文件會自動看到彼此,因此也會看到彼此的頂層內容。

屬性

屬性指的是聲明在對像類型聲明(枚舉、結構體或類;在示例1-1中,3個name變量就是屬性)頂層的變量。有兩種類型的屬性:實例屬性與靜態/類屬性。

實例屬性

在默認情況下,屬性就是實例屬性。其值對於該對像類型的每個實例來說都是不同的;其生命週期與實例的生命週期相同。回憶一下第1章,實例創建後(通過實例化)就存在了;實例隨後的生命週期取決於該實例所賦予的變量的生命週期。

靜態/類屬性

通過關鍵字static或class聲明的屬性就是靜態/類屬性(第4章將會對其進行詳細介紹)。其生命週期與對像類型的生命週期相同。如果對像類型聲明在文件頂層,或是聲明在另一個對像類型的頂層,而該對像類型又聲明在頂層,那麼這就意味著它會一直存在(只要程序運行就會存在)。

屬性對於對像聲明中的所有代碼都是可見的。比如,對象的方法可以看到該對象的屬性。代碼可以通過self加上點符號來引用屬性,我總是這樣做,不過除了一些可能會產生歧義的場景,通常可以省略掉。

在默認情況下,實例屬性對於其他代碼也是可見的,前提是其他代碼持有該實例的引用;在這種情況下,可以通過實例引用與點符號來引用屬性。在默認情況下,靜態/類屬性對於其他代碼也是可見的,只要其他代碼能夠看到該對像類型的名字即可;在這種情況下,可以通過對像類型與點符號來引用屬性。

局部變量

局部變量指的是聲明在函數體中的變量(在示例1-1中,變量two就是個局部變量)。局部變量的生命週期取決於外圍花括號的生命週期:當執行路徑進入作用域中並到達變量聲明處時,局部變量就產生了;當執行路徑退出作用域時,局部變量就會消亡。局部變量有時也叫作自動變量,表示它們會自動產生和消亡。

局部變量只能被相同作用域的後續代碼看到(包括相同作用域中後續更深層次的代碼)。