クラスの機能を拡張する手段として、エクステンションや継承、プロトコルといった方法が挙げられるが、今回はエクステンションを使ったクラス拡張の基本例を紹介する。

まずは元となるクラスを見ていこう。
それぞれ一つずつのプロパティとメソッドを持つ、シンプルなクラスだ。

class Player {
    var name:String = ""
    
    func hello() {
        print("Hello! \(name)")
    }
}

このPlayerクラスに対し、エクステンションではComputedプロパティと、メソッドを追加することができる。

extension Player {
    var who:String {
        get {
            return name
        }
        set(value) {
            name = value
        }
    }
    
    func bye() {
        print("Bye! \(name)")
    }
}

上記の例では、まずComputedプロパティを追加してwhoプロパティからnameプロパティへアクセスできるようにし、byeメソッドを追加している。

実際に拡張したPlayerクラスをインスタンス化し、動作確認をおこなってみる。

let obj = Player()
obj.who = "花子"
obj.hello()
obj.bye()

// Hello! 花子
// Bye! 花子

元のPlayerクラスには無かったはずのwhoとbyeが使えるようになっていることが分かる。