SequenceとCollectionについて深く掘り下げてみましょう。LinkedListを実装することでSequenceとIteratorがどのように相互作用するかを見ていきます。この講演ではCollectionと関連するプロトコルと型(Index、Sliceable、MutableCollectionなど)がそれぞれどのように相互作用するかについて説明します。最終的にSequenceとCollectionについて知りたかったこと以上のことがわかるようになるでしょう。
誰もが知りたいSequenceとCollectionのすべて
Swiftを扱う際に順番の整ったオブジェクトを使いたい場合99%Arrayになると思います。
入念に考えられたプロトコルのヒエラルキーやそれ以外のコンポーネントの組み合わせで素晴らしい機能が整っています
沢山資料は用意しています。25分で全てカバーします。
Sequenceプロトコルの上に全てがあります。Arrayとやり取りするバックボーンです。mapなど。
他のプロトコルははしごのように重なっているのでしたからみていきます。
Collection、BidirectionalCollectionまでご説明します。
Sequence
とてもわかり易いです。エレメントのリストで2つの重要な、有限である、そして一度しかいてレート出来ない(出来ても保証はない)ということです。
二つのコンポーネント、associatedtypeとmakeIterator()
ItelatorProtocolはElementがnext()でイテレートしていく。
ItelatorProtocolはSequenceのベースに構築されています。
リンクリストを構築してみたいと思います。
最初のエレメントが2つ目のエレメントを指し。。。。最後に至ります。
LinkList定義には私はenumを使うのが良いと思っています。
indirect enum LinkedListNode<T> { case value(element: T, next: LinkedListNode<T>) case end }
でもこれはmapなどは使えません。そのためにSequenceに対応します。
currentで代表されます
これがnext関数
値が戻されてnilだともう終わりです。
enumがあるのでいろんなことが出来ます。
2つケースが有ります。
次へ行くか終わりか。
nextで何をするか、currentをアップデートします。
これをSequenceに適用します。
やらないくてはいけないことはSequence型に適合、forやmapが出来るようになります。
Iteratorがどう動くか
Currentが最初の要素をポイントしています。
nextを呼び出すとCurrentが次の要素をポイントします。
全てのSquenceを作りたければどうしたら良いのか
いくつのオブジェクトが合格したか確認したいときどうしたら良いでしょう。
この関数をすべてのSequenceに適用したい
パラメータをcountにします
forでcountしていく
Userがadminなら1count up
もう一つ便利なのはEach Pair
Autolayoutの制約を追加する時に使ったり出来ます。
zipを使っています。
これは型消去です。
引数によってSequenceのタイプが出てこない。
制約を自分たちで次第で実装します。
subSequence がSequenceであることを保証したい
SubSequenceがあり、それがSequenceだと分かっているが、その中がまた同じタイプかわからない
そこで制約を加える
煩雑ですがこれしか方法はない
Collection
すべて有限である、複数回イテレート出来る
はじめと終わりのIndexがある。Indexがあるとsubscribeがある
たいてい位置からCollectionを実装することはないが
ErrorCollectionを使いたい
よくこれは使っています。Array出ないものをArray家のように振る舞わせます。
bidirectionCollection
コレクションを継承しています。前にも後ろにも戻れます。
一つ追加する必要があります。collectionにindex(before)を追加します。
var last: Iterator.Element? {
}
lastは最後まで行って最後のエレメントを一つ戻ってあたいを返す。
3つを見てきました
ランダムに行きたい要素に行けるCollection、コレクションの真ん中にある塊にアクセスできるCollectionなど
Swiftのドキュメントで見ることが出来ます
Q&A
SwiftのSequenceのassociatedTypeがIteratorだが他の言語ではElementになることが多い。何か良いことはあるのか?
IteratorがSwiftで表現力が増すということになると、何が良いか、Iteratorのときは内部で使われることが多いです。なので考えることはないですが、しかしそれ以外のときに、マニュアルで何か順番に見ていく時、たとえばいろんなページを遷移していく時、CollectionではなくIteratorを保持すれば良い。Nextを呼べば良い。Expressivenessを開けることが出来る。
ちょっと上手く伝わらなかったので後で行きます。
ほか