Edited at

SwiftのProtocolについての簡単な整理

More than 5 years have passed since last update.

自分自身が、Swiftの基本的な言語仕様の理解が曖昧なので(Java言語仕様任せ w)protocolの復習から。

protocolとは、おそらくJavaで言うところのinterfaceである。


Protocolの実装


MyProtocol.swift

protocol MyProtocol{

func protocolFunction01()
func protocolFunction02()
}


Classの実装

次に、protocolを継承したclassを作ってみる。

ここでは試しにprotocolを実装したclassから、わざと1つのメソッドを欠落させてみる。

当然、protocolに宣言した全てのメソッドを定義しないとエラーになる。

と言うことで、基本通り全てのメソッドを宣言する。


MySuper.swift

class MySuper:MyProtocol{

func protocolFunction01() {

}
func protocolFunction02() {

}
}


当然のようにエラーは消える。


Protocol イニシャライザの宣言

次にinitイニシャライザをprotocolに定義してみる。

ここでは、特に意味は無いがStringを引数にしてみた。


MyProtocol.swift

protocol MyProtocol{

init(str:String)
func protocolFunction01()
func protocolFunction02()
}

クラスMySuperでは、init(str:String)が無いために当然のようにエラーとなる。

そこでprotocolで定義したinit(str:String)をクラスに定義してみた。

しかし、別のエラーが発生した。

Initializer requirement 'I' can only be satisfied by a 'required' initializer in non-final class 'X'

どうやら、requiredなイニシャライザでないとダメらしい。

そこで、required修飾子を付けてみる。


ポイント

ここでのポイントは、protocolで宣言されたイニシャライザinitには、required修飾子が必要なようだ。