Swift變量聲明
變量聲明
變量聲明可以在你的程序裡聲明一個變量,它以關鍵字var來聲明。根據聲明變量類型和值的不同,如存儲和計算 變量和屬性,存儲變量和屬性監視,和靜態變量屬性,有著不同的聲明形式。(待改進) 所使用的聲明形式取決於變量所聲明的範圍和你打算聲明的變量類型。
注意:
你也可以在協議聲明的上下文聲明屬性,詳情參見類型屬性聲明。
存儲型變量和存儲型屬性
下麵的形式聲明了一個存儲型變量或存儲型變量屬性
var
variable name
:type
=expression
你可以在全局,函數內,或者在類和結構體的聲明(context)中使用這種形式來聲明一個變量。當變量以這種形式 在全局或者一個函數內被聲明時,它代表一個存儲型變量。當它在類或者結構體中被聲明時,它代表一個存儲型變量屬性。
構造器表達式可以被
和常量聲明相比,如果變量名是一個元祖類型,元祖的每一項的名字都要和初始化表達式一致。
正如名字一樣,存儲型變量的值或存儲型變量屬性存儲在內存中。
計算型變量和計算型屬性
如下形式聲明一個一個存儲型變量或存儲型屬性:
varvariable name
:type
{
get {
statements
}
set(setter name
) {
statements
}
}
你可以在全局,函數體內或者類,結構體,枚舉,擴展聲明的上下文中使用這種形式的聲明。 當變量以這種形式在全局或者一個函數內被聲明時,它代表一個計算型變量。當它在類,結構體,枚舉,擴展聲明的上下文 中中被聲明時,它代表一個計算型變量屬性。
getter用來讀取變量值,setter用來寫入變量值。setter子句是可選擇的,隻有getter是必需的,你可以將這些語句 都省略,隻是簡單的直接返回請求值,正如在隻讀計算屬性(read-only computed properites)中描述的那樣。 但是如果你提供了一個setter語句,你也必需提供一個getter語句。
setter的名字和圓括號內的語句是可選的。如果你寫了一個setter名,它就會作為setter的參數被使用。如果你不寫setter名, setter的初始名為newValue,正如在seter聲明速記(shorthand setter declaration)中提到的那樣。
不像存儲型變量和存儲型屬性那樣,計算型屬性和計算型變量的值不存儲在內存中。
獲得更多信息,查看更多關於計算型屬性的例子,請查看計算型屬性(computed properties)一節。
存儲型變量監視器和屬性監視器
你可以用willset和didset監視器來聲明一個存儲型變量或屬性。一個包含監視器的存儲型變量或屬性按如下的形式聲明:
varvariable name
:type
= expression {
willSet(setter name) {
statements
}
didSet(setter name
) {
statements
}
}
你可以在全局,函數體內或者類,結構體,枚舉,擴展聲明的上下文中使用這種形式的聲明。 當變量以這種形式在全局或者一個函數內被聲明時,監視器代表一個存儲型變量監視器; 當它在類,結構體,枚舉,擴展聲明的上下文中被聲明時,監視器代表屬性監視器。
你可以為適合的監視器添加任何存儲型屬性。你也可以通過重寫子類屬性的方式為適合的監視器添加任何繼承的屬性 (無論是存儲型還是計算型的),參見重寫屬性監視器(overriding properyt observers)。
初始化表達式在類或者結構體的聲明中是可選的,但是在其他地方是必需的。無論在什麼地方聲明, 所有包含監視器的變量聲明都必須有類型注釋(type annotation)。
當變量或屬性的值被改變時,willset和didset監視器提供了一個監視方法(適當的回應)。 監視器不會在變量或屬性第一次初始化時不會被運行,它們隻有在值被外部初始化語句改變時才會被運行。
willset監視器隻有在變量或屬性值被改變之前運行。新的值作為一個常量經過過willset監視器,因此不可以在 willset語句中改變它。didset監視器在變量或屬性值被改變後立即運行。和willset監視器相反,為了以防止你仍然 需要獲得舊的數據,舊變量值或者屬性會經過didset監視器。這意味著,如果你在變量或屬性自身的didiset監視器語句 中設置了一個值,你設置的新值會取代剛剛在willset監視器中經過的那個值。
在willset和didset語句中,setter名和圓括號的語句是可選的。如果你寫了一個setter名,它就會作為willset和didset的參數被使用。如果你不寫setter名, willset監視器初始名為newvalue,didset監視器初始名為oldvalue。
當你提供一個willset語句時,didset語句是可選的。同樣的,在你提供了一個didset語句時,willset語句是可選的。
獲得更多信息,查看如何使用屬性監視器的例子,請查看屬性監視器(prpperty observers)一節。
類和靜態變量屬性
class關鍵字用來聲明類的計算型屬性。static關鍵字用來聲明類的靜態變量屬性。類和靜態變量在類型屬性(type properties)中有詳細討論。
變量聲明語法
變量聲明 → 變量聲明頭(Head) 模式構造器列表
變量聲明 → 變量聲明頭(Head) 變量名 類型注解 代碼塊
變量聲明 → 變量聲明頭(Head) 變量名 類型注解 getter-setter塊
變量聲明 → 變量聲明頭(Head) 變量名 類型注解 getter-setter關鍵字(Keyword)塊
變量聲明 → 變量聲明頭(Head) 變量名 類型注解 構造器 可選 willSet-didSet代碼塊
變量聲明頭(Head) → 特性(Attributes)列表 可選 聲明描述符(Specifiers)列表 可選 var
變量名稱 → 標識符
getter-setter塊 → { getter子句 setter子句 可選 }
getter-setter塊 → { setter子句 getter子句 }
getter子句 → 特性(Attributes)列表 可選 get 代碼塊
setter子句 → 特性(Attributes)列表 可選 set setter名稱 可選 代碼塊
setter名稱 → ( 標識符 )
getter-setter關鍵字(Keyword)塊 → { getter關鍵字(Keyword)子句 setter關鍵字(Keyword)子句 可選 }
getter-setter關鍵字(Keyword)塊 → { setter關鍵字(Keyword)子句 getter關鍵字(Keyword)子句 }
getter關鍵字(Keyword)子句 → 特性(Attributes)列表 可選 get
setter關鍵字(Keyword)子句 → 特性(Attributes)列表 可選 set
willSet-didSet代碼塊 → { willSet子句 didSet子句 可選 }
willSet-didSet代碼塊 → { didSet子句 willSet子句 }
willSet子句 → 特性(Attributes)列表 可選 willSet setter名稱 可選 代碼塊
didSet子句 → 特性(Attributes)列表 可選 didSet setter名稱 可選 代碼塊