2017ジェネリクス周りのコードリーディングに苦戦しているのでちょっと話題を戻して再びサブタイピングについて。型自体を値として扱うときにでてくるやつら。T.selfという式の型がT.Typeであり、T.Typeのことを「メタタイプ」と呼ぶ。MetatypeTypeとExistentialMetatypeTypeの2つがあり、Pがprotocolのとき、P.TypeはExistentialMetatypeTypePがprotocolのとき、P.ProtocolはMetatypeTypeそれ以外のT.TypeはMetatypeTypeとなる。型.selfのような構文でメタタイプに型付けされる値を表現できるが、protocolとそれ以外で微妙にセマンティクスが違うことに注意。Pがprotocolのとき、P.selfはP.Protocol型の値。それ以外のT.selfはT.Type型の値。「メタタイプのメタタイプの....」のようにメタタイプ自体もメタタイプを持つ。ExistentialMetatypeTypeのExistentialMetatypeTypeのメタタイプ実装としては上のクラス図を頭に入れとけば概ね問題ないが、1点AnyMetatypeType::getInstanceTypeというメソッドでT.TypeのTを得ることができるということだけ抑えておけばよさそう。meta->getInstanceType()今回はこのややこしそうなメタタイプについてのサブタイピング規則を確認しておく。superclass関係に基づくサブタイピング規則lib/Sema/CSSimplify.cppによると、classのメタタイプには以下のようなサブタイプ関係がある。classes.つまりクラスのメタタイプはクラスのサブタイプ関係について共変である。Animal.Typeが成立する。lib/Sema/CSSimplify.cppによると、protocolのメタタイプには以下のようなサブタイプ関係がある。Q.Protocol」ではないことに注意。参考これを再現できる良い例が思い浮かばないけど、一応以下から確認できる。前回説明したConversionRestriction(セマンティクスに影響するサブタイピング)にもメタタイプに関するものがある。名前の通りMetatypeとExistentialMetatype間のサブタイピングで、規則はコメント中には書いてないけど、あえて書くならこんな感じ。P例としては以下のような場合。protocolのMetatypeとはサブタイプ関係はないので注意。falseこれ地味にハマるところで、この例だとまだわかりやすいけど、例えばジェネリックな関数に渡すとぱっと見た感じは同じだが、挙動に違いが出る。B.TypeがAnimal.Protocolを指すことになりfalseになる。Animalその他の規則あとはマイナーなものしかないので参考程度にメモ。enabled.サブタイプにならないメタタイプAはOptional<A>のサブタイプであることは前回紹介したが、これについては特に規則が用意されていないためメタタイプ同士にはサブタイプ関係はない。B.Typeとは限らない)ことに注意。