Swift中的類型屬性(靜態變量)


http://blog.haohtml.com/archives/15098

Swift中的類型屬性(靜態變量)

類型屬性語法

在 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。

Static Properties VUMeter

上面所描述的聲道模型使用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來創建表示立體聲系統的兩個聲道leftChannelrightChannel

var leftChannel = AudioChannel()
var rightChannel = AudioChannel()

如果將左聲道的電平設置成 7,類型屬性maxInputLevelForAllChannels也會更新成 7:

leftChannel.currentLevel = 7
println(leftChannel.currentLevel)
// 輸出 "7"
println(AudioChannel.maxInputLevelForAllChannels)
// 輸出 "7"

如果試圖將右聲道的電平設置成 11,則會將右聲道的currentLevel修正到最大值 10,同時maxInputLevelForAllChannels的值也會更新到 10:

rightChannel.currentLevel = 11
println(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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM