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を指定させておくと、安全に便利に実装できそうです.