標籤:
http://blog.haohtml.com/archives/15098
Swift中的類型屬性(靜態變數)Posted on 2014/06/13類型屬性文法
在 C 或 Objective-C 中,靜態常量和靜態變數的定義是通過特定類型加上global
關鍵字。在 Swift 程式設計語言中,類型屬性是作為類型定義的一部分寫在類型最外層的花括弧內,因此它的作用範圍也就在類型支援的範圍內。
使用關鍵字static
來定義實值型別的類型屬性,關鍵字class
來為類(class)定義類型屬性。下面的例子示範了儲存型和計算型類型屬性的文法:
struct SomeStructure { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { // 這裡返回一個 Int 值 }}enum SomeEnumeration { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { // 這裡返回一個 Int 值 }}class SomeClass { class var computedTypeProperty: Int { // 這裡返回一個 Int 值 }}
注意:
例子中的計算型類型屬性是唯讀,但也可以定義可讀可寫的計算型類型屬性,跟執行個體計算屬性的文法類似。
擷取和設定類型屬性的值
跟執行個體的屬性一樣,類型屬性的訪問也是通過點運算子來進行,但是,類型屬性是通過類型本身來擷取和設定,而不是通過執行個體。比如:
println(SomeClass.computedTypeProperty)// 輸出 "42"println(SomeStructure.storedTypeProperty)// 輸出 "Some value."SomeStructure.storedTypeProperty = "Another value."println(SomeStructure.storedTypeProperty)// 輸出 "Another value.”
下面的例子定義了一個結構體,使用兩個儲存型類型屬性來表示多個聲道的聲音電平值,每個聲道有一個 0 到 10 之間的整數表示聲音電平值。
後面的圖表展示了如何聯合使用兩個聲道來表示一個立體聲的聲音電平值。當聲道的電平值是 0,沒有一個燈會亮;當聲道的電平值是 10,所有燈點亮。本圖中,左聲道的電平是 9,右聲道的電平是 7。
上面所描述的聲道模型使用AudioChannel
結構體來表示:
struct AudioChannel { static let thresholdLevel = 10 static var maxInputLevelForAllChannels = 0 var currentLevel: Int = 0 { didSet { if currentLevel > AudioChannel.thresholdLevel { // 將新電平值設定為閥值 currentLevel = AudioChannel.thresholdLevel } if currentLevel > AudioChannel.maxInputLevelForAllChannels { // 儲存當前電平值作為新的最大輸入電平 AudioChannel.maxInputLevelForAllChannels = currentLevel } } }}
結構AudioChannel
定義了 2 個儲存型類型屬性來實現上述功能。第一個是thresholdLevel
,表示聲音電平的最大上限閾值,它是一個取值為 10 的常量,對所有執行個體都可見,如果聲音電平高於 10,則取最大上限值 10(見後面描述)。
第二個類型屬性是變數儲存型屬性maxInputLevelForAllChannels
,它用來表示所有AudioChannel
執行個體的電平值的最大值,初始值是 0。
AudioChannel
也定義了一個名為currentLevel
的執行個體儲存屬性,表示當前聲道現在的電平值,取值為 0 到 10。
屬性currentLevel
包含didSet
屬性監視器來檢查每次新設定後的屬性值,有如下兩個檢查:
- 如果
currentLevel
的新值大於允許的閾值thresholdLevel
,屬性監視器將currentLevel
的值限定為閾值thresholdLevel
。
- 如果修正後的
currentLevel
值大於任何之前任意AudioChannel
執行個體中的值,屬性監視器將新值儲存在靜態屬性maxInputLevelForAllChannels
中。
注意:
在第一個檢查過程中,didSet
屬性監視器將currentLevel
設定成了不同的值,但這時不會再次調用屬性監視器。
可以使用結構體AudioChannel
來建立表示立體聲系統的兩個聲道leftChannel
和rightChannel
:
var leftChannel = AudioChannel()var rightChannel = AudioChannel()
如果將左聲道的電平設定成 7,類型屬性maxInputLevelForAllChannels
也會更新成 7:
leftChannel.currentLevel = 7println(leftChannel.currentLevel)// 輸出 "7"println(AudioChannel.maxInputLevelForAllChannels)// 輸出 "7"
如果試圖將右聲道的電平設定成 11,則會將右聲道的currentLevel
修正到最大值 10,同時maxInputLevelForAllChannels
的值也會更新到 10:
rightChannel.currentLevel = 11println(rightChannel.currentLevel)// 輸出 "10"println(AudioChannel.maxInputLevelForAllChannels)// 輸出 "10"
轉自:http://numbbbbb.github.io/the-swift-programming-language-in-chinese/chapter2/10_Properties.html
This entry was posted in 程式開發 and tagged swift by admin. Bookmark the permalink.
Swift中的類型屬性(靜態變數)