[Swift5] Methods 2


  • 以下はSWIFT 5.6 DocのMethods学習内容のまとめです.
  • Methods


    タイプメソッド


    インスタンスではなく、タイプで宣言されるメソッドです.メソッドを宣言する前に、staticキーワードを使用します.クラスはclassのキーワードを使用して、サブクラスが親メソッドを上書きします.
    この方法の特徴は、インスタンスメソッドのように.演算子で呼び出すことができるが、インスタンスを作成する必要がなく、タイプ自体から直接宣言することができることである.
    class SomeClass {
        class func someTypeMethod() {
            // type method implementation goes here
        }
    }
    SomeClass.someTypeMethod()
    SomeClassはインスタンスではなくクラスタイプであることがわかる.
    タイプメソッドは、前にタイプ名を書く必要はありません.タイプメソッド名だけで使用できます.
    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
            }
        }
    }
    highestUnlockedLevelは、タイプメソッドによって管理される.与えられたパラメータ値がlevelより大きい場合、更新highestUnlockedLevelのパラメータ値はunlockであり、パラメータ値がlevelより小さい場合、戻り基準値はhighestUnlockedLevelである.これは、これまでに入力されたisUnlockedの中で、最も高い価格を維持する比較方法である.
    タイプメソッドおよびタイプpropertyがインスタンスを参照できる場合、levelなどのインスタンスpropertyを使用して、インスタンスを使用するユーザの個人情報を追跡できます.
    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
        }
    }
    
    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 hasn't yet been unlocked")
    }
    // Prints "level 6 hasn't yet been unlocked"
    currentLevelレベルで各プレイヤーの各レベルを追跡し、タイプメソッドでタイプpropertyが最高値を得ることができます.インスタンスのプロパティとタイプのプロパティと値のPlayerを比較して、現在のインスタンスが持つレベルが解除されているかどうかを確認します.