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