SwiftUI語言基礎之 Type Methods 教程及使用代碼

Type Methods

實例方法是您在特定類型的實例上調用的方法。 您還可以定義在類型本身上調用的方法。 這些方法稱爲類型方法。 您可以通過在方法的func關鍵字之前寫入static關鍵字來指示類型方法。 類可以改用class關鍵字,以允許子類覆蓋超類對該方法的實現。

在Objective-C中,您只能爲Objective-C類定義類型級別的方法。 在Swift中,您可以爲所有類,結構和枚舉定義類型級別的方法。 每個類型方法都明確地限定於它支持的類型。

類型方法使用點語法來調用,就像實例方法一樣。 但是,您在類型上而不是在該類型的實例上調用類型方法。 在名爲SomeClass的類上調用類型方法的方法如下:

class SomeClass {
    class func someTypeMethod() {
        // type method implementation goes here
    }
}
SomeClass.someTypeMethod()

在類型方法的主體內,隱式self屬性是指類型本身,而不是該類型的實例。這意味着您可以使用self來區分類型屬性和類型方法參數,就像處理實例屬性和實例方法參數一樣。

更一般而言,在類型方法主體中使用的任何不合格的方法和屬性名稱都將引用其他類型級別的方法和屬性。一個類型方法可以使用另一個方法的名稱來調用另一個類型方法,而無需在其前面加上類型名稱。同樣,結構和枚舉上的類型方法可以使用類型屬性的名稱訪問類型屬性,而無需使用類型名稱前綴。

下面的示例定義了一個稱爲LevelTracker的結構,該結構可跟蹤玩家在遊戲的不同關卡或階段中的進度。這是一款單人遊戲,但可以在單個設備上存儲多個玩家的信息。

首次玩遊戲時,所有遊戲級別(除了第一級)都被鎖定。每次玩家完成一個關卡時,設備上的所有玩家都將解鎖該關卡。 LevelTracker結構使用類型屬性和方法來跟蹤遊戲的哪些級別已解鎖。它還跟蹤單個玩家的當前級別。

struct LevelTracker {
    static var highestUnlockedLevel = 1
    var currentLevel = 1

    static func unlock(_ level: Int) {
        if level > highestUnlockedLevel { highestUnlockedLevel = level }
    }

    static func isUnlocked(_ level: Int) -> Bool {
        return level <= highestUnlockedLevel
    }

    @discardableResult
    mutating func advance(to level: Int) -> Bool {
        if LevelTracker.isUnlocked(level) {
            currentLevel = level
            return true
        } else {
            return false
        }
    }
}

LevelTracker結構跟蹤所有玩家已解鎖的最高級別。此值存儲在名爲maximumUnlockedLevel的類型屬性中。

LevelTracker還定義了兩個類型函數,以與highestUnlockedLevel屬性一起使用。第一個是稱爲unlock(_ :)的類型函數,每當解鎖新級別時,該函數都會更新highestUnlockedLevel的值。第二個是便捷類型函數,稱爲isUnlocked(_ :),如果特定級別的數字已被解鎖,則返回true。 (請注意,這些類型方法可以訪問maximumUnlockedLevel類型屬性,而無需將其編寫爲LevelTracker.highestUnlockedLevel。)

除了其type屬性和type方法之外,LevelTracker還可以跟蹤單個玩家在遊戲中的進度。它使用稱爲currentLevel的實例屬性來跟蹤玩家當前正在玩的級別。

爲了幫助管理currentLevel屬性,LevelTracker定義了一個稱爲advance(to :)的實例方法。在更新currentLevel之前,此方法檢查所請求的新級別是否已被解鎖。 advance(to :)方法返回一個布爾值,以指示它是否實際上能夠設置currentLevel。由於調用先進方法(to :)忽略返回值不一定是錯誤的代碼,因此此函數標有@discardableResult屬性。有關此屬性的更多信息,請參見屬性。

LevelTracker結構與Player類一起使用,如下所示,用於跟蹤和更新單個玩家的進度:

class Player {
    var tracker = LevelTracker()
    let playerName: String
    func complete(level: Int) {
        LevelTracker.unlock(level + 1)
        tracker.advance(to: level + 1)
    }
    init(name: String) {
        playerName = name
    }
}

Player類創建一個新的LevelTracker實例來跟蹤該玩家的進度。 它還提供了一種稱爲complete(level :)的方法,每當玩家完成特定級別時就會調用該方法。 此方法爲所有玩家解鎖下一個級別,並更新玩家的進度以將他們移至下一個級別。 (Advance(to :)的布爾返回值將被忽略,因爲已知該級別已通過調用上一行的LevelTracker.unlock(_ :)進行了解鎖。)

您可以爲新玩家創建Player類的實例,並查看該玩家完成第一級後會發生什麼:

var player = Player(name: "Argyrios")
player.complete(level: 1)
print("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)")
// Prints "highest unlocked level is now 2"

如果您創建第二個玩家,嘗試將其移動到遊戲中尚未被任何玩家解鎖的級別,則設置該玩家當前級別的嘗試將失敗:

player = Player(name: "Beto")
if player.tracker.advance(to: 6) {
    print("player is now on level 6")
} else {
    print("level 6 has not yet been unlocked")
}
// Prints "level 6 has not yet been unlocked"

推薦

基礎文章推薦

經典教程推薦

上新

技術源碼推薦

推薦文章

CoreData篇

Combine篇

TextField篇

JSON文件篇


一篇文章系列

技術交流

QQ:3365059189
SwiftUI技術交流QQ羣:518696470

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章