Protocol Animalがあり、それを継承するCat() , Dog()がある場合Existential Containerは、Animalに適合されたどの型もインスタンスで格納できるように、メモリの領域を最大に取る。今回のケースだとDogに合わせてメモリが確保される。Catを呼び出す時に、Dog分のメモリが確保されるのでパフォーマンス上良くない。 ジェネリクスかリバースジェネリクスで、この問題を解決する。 ジェネリクスは、実装者がAnimalに対してコードを書き、リバースジェネリクスは、Animalに対してコードを書く。それぞれのジェネリクスとリバースジェネリクスの記法をシンタックスシュガーで someを使って書く事ができるようにしたのが、Opaque Result Type