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