初めに
今日はswiftの基本的なところであるprotocolとprotocol extensionについて自分なりにまとめていきます。
protocolとは
定義は下のような感じで書きます。
protocol hoge {
func hugahuga() -> Int
}
関数の処理などは書きません。定義だけします。
クラスなどにprotocolを準拠させる場合は
protocol hoge {
func hugahuga() -> Int
}
class viewController: hoge {
}
みたいな感じになりマス。
ただしprotocolを準拠したクラスは必ずprotocolで定義されている関数などを継承させなければならないので上のclassは実際にはエラーになります。
正しくは
protocol hoge {
func hugahuga() -> Int
}
class viewController: hoge {
func hugahuga() -> Int {
return 5
}
}
となります。
クラス継承と違ってprotocolは一つのクラスに複数継承できます。
classと一緒にprotocolを継承する場合は下のように書きます。
class viewController: スーパークラス名,protocolA名,protocolB名 {
}
protocolはclass,extension,sturct,enum,クロージャの他にも変数の型としても使えます。
例えば
protocol UserProtocol {
var name: String { get }
}
func hoge(x: Protocol名){
print(x.name)
}
みたいな感じに使えます。
他にもDI(DependencyInjection)に使えたりするのでめちゃくちゃ便利ですね。
まだまだありますがprotocolの説明はこんくらいにしときます。
protocol extension
protocol extensionはprotcolの機能を拡張するものです。
protocol Hoge{
var x: Int { get }
}
extension protocol hoge{
var y: Int { return 5 }
}
class Huga1: Hoge {
var x: Int
}
class Huga2: Hoge {
var x: Int { return 1 }
var y: Int { return 2 }
}
Huga1().x //1
Huga1().y //5 huga1でyを定義していないのでextensionのデフォルト値が呼ばれる。
Huga2().x //1
Huga2().y //2
extension protocolで定義したものは準拠したクラスや構造体で必ず継承しなければならないということはありません。
なので上の例ではHuga.xはHugaでは定義されていませんがextensionで定義してある5が返されています。
このようにextensionにdefaut値を設定することをデフォルト実装と言います。
protocol extensionは型制約を追加することができて条件を満たす時だけプロトコルエクステンションを有効化できます。
extension protocol名 Where 型制約 {
制約を満たした時だけ有効になる処理。
}
最後に
これだけでは全部網羅したとは言えませんが自分なりにざっくりまとめてみました。
protocolまじで便利。ということで寝ますおやすみなさい。