シーケンスとコレクションを扱うためのプロトコル
シーケンスとはその要素に一方向から順次アクセス可能なデータ構造です。
例えば、配列は先頭のインデックスから要素に順次アクセスできるため、シーケンスの一種であると言えます。
標準ライブラリにはシーケンスを汎用的に扱うためにSequenceプロトコルが用意されています。
コレクションは、一方向からの順次アクセスと、特定のインデックスの値への直接アクセスが可能なデータ構造です。
機能の差からわかるように、コレクションはシーケンスを内包する概念です。
Sequenceプロトコルは、次のインターフェースを提供します。
forEach
filter
map
flatMap
compactMap
reduce
使い方の例
filter
指定した条件を満たす要素のみを含む、新しいシーケンスを返すメソッドです。
let array = [1, 2, 3, 4, 5]
let enumerated2 = array.filter({e in e % 2 == 0})
print(enumerated2) // 2, 4
compactMap
compactMapは全ての要素を特定の処理で変換するという点ではmapメソッドと同じですが、変換できない値を無視するという点が異なります。
let strings = ["foo", "123", "bar", "456"]
let integers = strings.compactMap({value in Int(value)})
print(integers)
結果は、変換に成功した123と456のみを含むInt型の配列です。変換に失敗した"foo"や"bar"は無視された事がわかります。
Collectionプロトコルは、Sequenceプロトコルを継承しています。
そのため、Collectionプロトコルにい準拠する型に対しては、Sequenceプロトコルが提供するfilterや、mapを使用可能です。
let array = [1, 2, 3, 4, 5]
array[3] // 4
array.isEmpty // false
array.count // 5
array.first // 1
array.last // 5