BETA

protocolのSelf:11/17

投稿日:2018-11-17
最終更新:2018-11-17

ささおです。

Qrunch初投稿です。 注意:何も解決しない記事です

Selfがあるprotocolはexitentialとして使うことができません。

protocolにSelf

protocol AProtocol {
    func a(hoge: Self)
}
class AClass: AProtocol {
    func a(hoge: AClass) {}
}
let aClass: AProtocol = AClass() // Protocol 'AProtocol' can only be used as a generic constraint because it has Self or associated type requirements

こんな感じですね。AProtocolをexitentialとしてしようしたところでコンパイルエラーになります。

extensionにSelf

protocol AProtocol {
}
extension AProtocol {
    func a(hoge: Self) 
}
class AClass: AProtocol {
    func a(hoge: AClass) {}
}
let aClass: AProtocol = AClass() // エラーが出ない
aClass.a(hoge: AClass()) // Member 'a' cannot be used on value of protocol type 'AProtocol'; use a generic constraint instead

こっちはAProtocolをexitentialとしてしようしたところではコンパイルエラーにならず、 Selfを利用した関数を呼び出す段階でコンパイルエラーになります。

なんというか全体的によくわからん。。。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@sasaoの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!