Swiftのプロトコルは、クラスが必ず実装しなければいけないプロパティ・メソッドを指定するもので、Javaなどの他言語ではインターフェースと呼ばれている。

プロトコルの定義

プロパティの初期値やメソッドの機能、アクセス権なども定義せず、以下のような書式でプロトコルを定義する。

protocol GameProtocol {
    var gamePoint:Int { get }
    func hit()
    func miss()
}

上記の例では読み込み専用のgamePointプロパティ、hit、missの二つのメソッドを指定している。

ここで定義したGameProtocolを採用したクラスや構造体、列挙体では、必ずgamePointプロパティ、hitメソッド、missメソッドを実装しなければならない。

プロトコルを採用する

以下のMyGameクラスでは、先ほど定義したGameProtocolを採用している。

class MyGame:GameProtocol {
    private var total = 0
    
    var gamePoint: Int {
        get {
            return total
        }
    }
    
    func hit() {
        total += 10
        print("ヒット! +10")
    }
    
    func miss() {
        total /= 2
        print("ミス! 半減")
    }
}

なお、gamePointプロパティはプロトコルで読み込み専用(get)として指定したので、ここではComputedプロパティでgetのみを実装している。

それではこのクラスをインスタンス化し、実装したプロパティとメソッドを使ってみる。

let myGameObj = MyGame()

myGameObj.hit()
print(myGameObj.gamePoint)

myGameObj.miss()
print(myGameObj.gamePoint)

myGameObj.hit()
print(myGameObj.gamePoint)

// 以下実行結果
ヒット! +10
10
ミス! 半減   
5
ヒット! +10
15

プロトコルで指定したプロパティ、メソッドのうち、どれか一つでも実装されていないとエラーが発生するので、試しに一度確認してみると分かりやすいかもしれない。