最近はGithubでお世話になっているライブラリのコードリーディングをしたりして、
どのように実装されているかとか、どういう書き方やジェネリクスの使い方してるか、とか学んでいます。
その中で、興味深いものを見つけたので、書き留めておきます。

class プロトコル…?


きっかけは、Geccoなどのライブラリで有名な、yukiasaiさんの、 Kageeというライブラリのコードリーディングをしている時に、以下のような記述を発見。

public protocol MockType: class {
    ....
}

こ れ は 一 体 …!
class って、

class SomeClass {

}

って使うだけじゃなくて、protocolとしても指定できるの…?継承させた場合ってどうなるの? ということで、試してみた

検証してみる


こんな感じでコードを書いてみました。

protocol OnlyClassProtocol: class {

}

class A: OnlyClassProtocol {

}
struct B: OnlyClassProtocol { // error!

}

さて、これをPlayground等で実行すると…
struct B でエラーが出ました。

どうやら、protocolとして class を指定すると、 class でしかprotocolを適応できなくなるみたいです。
ちなみにその逆で、 struct や enum といった指定はできないようです。

(追記)


どうやらこれは、Class Only Protocol と呼ばれているみたいです。