Swiftのプロトコル定義におけるSelfとは

Swiftプロトコルで良くみるSelf.
これはなんぞやということで、調べてみたところ、簡単に言うとそのプロトコルを適合させた型自身を指すようです. (ちなみにSelfは予約語)
Self自体を型として使うことはできず、そのSelfの部分を、適合させた型で置き換える必要があります。
言い換えれば、プロトコルに適合した型でないと静的にエラーを吐いてくれるので、間違った型を指定することがなくなる、とも言えると思います.

例えば、MonsterTypeというプロトコルを定義し、Pockemonの列挙型に適合させるとします.

protocol MonsterType {
  //関数の返り値にSelfとする
  func type() -> Self
}

enum Pockemon:Int, MonsterType {
  case ピカチュウ
  case プリン
  case ポッポ

  //プロトコル実装
  //この場合、Pockemon型で返す
  func type() -> Pockemon {
    return Pockemon(self.rawValue)
  }
}

例としては微妙ですが、、、
MonsterTypeを適合させたPockemonは関数の実装時に、プロトコルの宣言ではSelfであった部分をPockemonに変更しています.
ここがSelfのままだと、エラーでコンパイルできません.

enum Pockemon:Int, MonsterType {
  case ピカチュウ
  case プリン
  case ポッポ

  //プロトコル実装
    func type() -> Self {
    return Pockemon(self.rawValue)
  }
  //=> エラー : Type 'Pockemon' does not conform to protocol 'MonsterType'
}

このように、プロトコル内で型を、そのプロトコルを適合させた型で実装したい時にSelfを指定させておくと、安全に便利に実装できそうです.