LoginSignup
2
2

More than 3 years have passed since last update.

Swiftのprotocolとprotocol extensionまとめる。

Posted at

初めに

今日はswiftの基本的なところであるprotocolとprotocol extensionについて自分なりにまとめていきます。

protocolとは

定義は下のような感じで書きます。

protocol定義
protocol hoge {
  func hugahuga() -> Int
}

関数の処理などは書きません。定義だけします。

クラスなどにprotocolを準拠させる場合は

protocolをクラスに準拠させる。(エラー)
protocol hoge {
  func hugahuga() -> Int
}
class viewController: hoge {

}

みたいな感じになりマス。
ただしprotocolを準拠したクラスは必ずprotocolで定義されている関数などを継承させなければならないので上のclassは実際にはエラーになります。
正しくは

protocolをクラスに準拠させる。
protocol hoge {
  func hugahuga() -> Int
}

class viewController: hoge {
  func hugahuga() -> Int {
    return 5
  }
}

となります。
クラス継承と違ってprotocolは一つのクラスに複数継承できます。
classと一緒にprotocolを継承する場合は下のように書きます。

protocolと親クラスを子クラスに準拠させる。

class viewController: スーパークラス名,protocolA名,protocolB名 {

}

protocolはclass,extension,sturct,enum,クロージャの他にも変数の型としても使えます。
例えば

変数の型にprotocolを使う
protocol UserProtocol {
  var name: String { get }
}
func hoge(x: Protocol名){
   print(x.name)
}

みたいな感じに使えます。
他にもDI(DependencyInjection)に使えたりするのでめちゃくちゃ便利ですね。
まだまだありますがprotocolの説明はこんくらいにしときます。

protocol extension

protocol extensionはprotcolの機能を拡張するものです。

protocolextension
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は型制約を追加することができて条件を満たす時だけプロトコルエクステンションを有効化できます。

ProtocolExtension型制約
extension protocol名 Where 型制約 {
  制約を満たした時だけ有効になる処理
}

最後に

これだけでは全部網羅したとは言えませんが自分なりにざっくりまとめてみました。
protocolまじで便利。ということで寝ますおやすみなさい。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2