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

1.7 作用域與生命週期

在Swift程序中,一切事物都有作用域。這指的是它們會被其他事物看到的能力。一個事物可以嵌套在其他事物中,形成一個嵌套的層次結構。規則是一個事物可以看到與自己相同層次或是更高層次的事物。層次有:

·模塊是一個作用域。

·文件是一個作用域。

·對像聲明是一個作用域。

·花括號是一個作用域。

在聲明某個事物時,它實際上是在該層級的某個層次上進行的聲明。它在層級中的位置(即作用域)決定了是否能被其他事物看到。

再來看看示例1-1。在Manny的聲明中是個name變量聲明和一個sayName函數聲明;sayName花括號中的代碼可以看到更高層次中花括號之外的內容,因此它可以看到name變量。與之類似,changeOne函數體中的代碼可以看到文件頂層所聲明的one變量;實際上,該文件中的一切事物都可以看到文件頂層所聲明的one變量。

作用域是共享信息的一種非常重要的手段。聲明在Manny中的兩個不同函數都會看到在Manny頂層所聲明的name變量。Jack中的代碼與Moe中的代碼都可以看到聲明在文件頂層的one。

事物還有生命週期,這與其作用域是相關的。一個事物的生命週期與其外部作用域的生命週期是一致的。因此,在示例1-1中,變量one的生命週期就與文件一樣,只要程序處於運行狀態,one就是有效的。它是全局且持久的。不過,聲明在Manny頂層的變量name只有在Manny存在時才存在(稍後將會對此做出說明)。聲明在更深層次中的事物的生命週期會更短;比如,看看下面這段代碼:


func silly {
    if true {
        class Cat {}
        var one = 1
        one = one + 1
    }
}  

在上述代碼中,類Cat與變量one只在代碼執行路徑通過if結構這一短暫的時間內才會存在。當調用函數silly時,執行路徑就會進入if結構中,Cat會被聲明並進入存活狀態;接下來,one被聲明並進入存活狀態;然後代碼行one=one+1會被執行;接下來作用域結束,Cat與one都會消失殆盡。