今日が火曜日だったら完璧だったのに...今回は「あなたの知らないCollectionの世界」というテーマでお送りします。(シーケンスの持つ)要素(element)が複数回、非破壊的に走査することができて、インデックスされた添字によってアクセスできるシーケンスのことを指すようです。DictionaryやSetなんかも。それ以降はこのCollectionをベースに多岐に渡って様々なprotocol、structに展開されていきます。最終的にはArrayやDictionary、Set、AnyCollection、StringのCharacterViewなどに辿り着きます。横に長いので、見たい方は↓をご覧ください。sortなどの関数が使えるなどなど。(※一部、Sequenceのみでもできることがあります)基本的にはArrayやDictionaryで普段使っていると思うので、馴染みがあるのではと思います。Collectionを自作の型で使ってみる試しにCollectionに適合させた自作の型を作ってみますFizzBuzzをCollectionでFizzBuzzをCollectionで作ってみます。limitを与えることで、1〜limit(limit含む)をFizz,Buzzを使って表せるCollectionとして定義してみます。適合するためには、少なくとも以下の定義が必要になってきます。}実はこれらが決まることで、本来は定義が必須となっていますが、以下のものも定まるようになります。Intただ、こちらも以下のようにそれぞれの関数で型を正確に与えてあげることでIndex及びElementの型が定まるので、typealiasでの定義は不要になります。}}個人的には、最初にtypealiasで型を書いて...としたほうが宣言時は分かりやすいのですが、使う時に_Elementみたいに見えてしまうので、後者の書き方のほうが好きですまた、注意点としては、subscriptやindex(after:)では範囲外になってしまうかどうかの判定をしてあげると良いでしょう。positionの部分を、indices.contains(position)なんてちょっと格好つけてしまうとここに計算コストがかかってしまって遅くなってしまうので注意です。lastが取れない...だと。CollectionをBidirectionalCollectionにしてあげる必要があります。Self.Indexindex(before:)を実装しろと言われるので実装します。Error!継承図を見るとこんな感じ。CollectionとBiDirectionalIndexableを継承しています。ここまで扱えるようになれば自作のCollectionとしては十分なものとなったと思います。して実装してみてもよいかもしれません。実装できるのが望ましいようです。まで話が進みましたが、更に進めていくとArrayにたどり着くことができます。普段何気なく使っているArrayも、このようにいくつものprotocolを経て成り立っているのがわかります。protocol指向なんだなと思い知らされますAnyCollectionとは...AnyCollectionは、Collectionを継承していて、Collectionを型消去して扱うことができるようになるstructです。型消去に関しては平常心で型を消し去るを見るのをおすすめします。