文書   >   Swift   >   Swift 標準ライブラリ   >   Collections   >   Sequence and Collection Protocols   >   Collection
プロトコル
Collection
その要素が複数回、非破壊的に横断され、インデックス付きサブスクリプトによってアクセスできるシーケンス。
概要
コレクションは、標準ライブラリ全体で広く使用されています。配列、辞書、およびその他のコレクションを使用する場合は、Collection プロトコルが宣言して実装する際のメリットがあります。コレクションが Sequence プロトコルから継承する操作に加えて、コレクション内の特定の位置にある要素にアクセスすることに依存するメソッドにアクセスできます。
たとえば、文字列の最初の単語だけを印刷したい場合は、最初の空白のインデックスを検索し、その位置までの部分文字列を作成できます。
let text = "Buffalo buffalo buffalo buffalo."
if let firstSpace = text.firstIndex(of: " ") {
print(text[..<firstSpace])
}
// Prints "Buffalo"
firstSpace 定数は、文字列内の最初のスペースの位置である text 文字列へのインデックスです。インデックスを変数に格納し、コレクションアルゴリズムにそれらを渡したり、後で対応する要素にアクセスするために使用することができます。上記の例では、firstSpace を使用して、そのインデックスまでの要素を含む接頭辞 (prefix) を抽出しています。
個々の要素へのアクセス
コレクションの endIndex プロパティ以外の何か有効なインデックスを使用して、そのサブスクリプトを使用してコレクションの要素にアクセスできます。このプロパティは、コレクションのどの要素にも対応していない "終わりを過ぎた" インデックスです。
そのサブスクリプトで文字列の最初の文字にアクセスする例を次に示します。
let firstChar = text[text.startIndex]
print(firstChar)
// Prints "B"
Collection プロトコルは、サブスクリプトによってアクセス可能な要素に依存する多くの操作に対して、デフォルトの実装を宣言して提供します。たとえば、コレクションの最初の要素の値を持つ最初の (first) プロパティを使用して text の最初の文字にアクセスすることもできるし、またはコレクションが空の場合 nil を使用します。
print(text.first)
// Prints "Optional("B")"
コレクション操作に渡すことができるのは有効なインデックスのみです。コレクションの有効なインデックスの完全なセットは、コレクションの startIndex プロパティから始まり、endIndex プロパティを含むすべての後続アイテムを検索することによって見つけることができます。別のコレクションの startIndex プロパティなど、Index 型の他のすべての値は、このコレクションの無効なインデックスです。
変更された操作の結果として、保存されたインデックスが無効になることがあります。可変コレクションのインデックス無効化の詳細については、MutableCollection および RangeReplaceableCollection プロトコルのリファレンス、および使用している特定の型のリファレンスを参照してください。
コレクションのスライスへのアクセス
その範囲にあるサブスクリプトを通して、または prefix(while:) や suffix(_:) のようなメソッドを呼び出すことによって、コレクションのスライスにアクセスできます。コレクションのスライスには、元のコレクションの要素の 0 個以上の要素を含めることができ、元のコレクションのセマンティクスを共有できます。
以下の例では、prefix(while:) メソッドを使用して text 文字列のスライスを取得し、firstWord 定数を作成します。
let firstWord = text.prefix(while: { $0 != " " })
print(firstWord)
// Prints "Buffalo"
文字列の範囲内のサブスクリプトを使用して同じスライスを取得することができます。これには範囲式が使用されます。
if let firstSpace = text.firstIndex(of: " ") {
print(text[..<firstSpace]
// Prints "Buffalo"
}
取得された text のスライスは、これらの各ケースで同等です。
スライスはインデックスを共有する
コレクションとそのスライスは同じインデックスを共有します。コレクションの要素は、スライスが作成されてから、コレクションまたはスライスのいずれも変更されていない限り、基本コレクションと同じスライス内の同じインデックスの下にあります。
たとえば、セッション中に各クラスからの休止数を保持する配列があるとします。
var absences = [0, 2, 0, 4, 0, 3, 1, 0]
あなたは、セッションの後半に休止の多い日を見つけることを任されています。問題の日のインデックスを見つけるには、以下の手順を実行します。
- 後半の日を保持する abseences 配列のスライスを作成します。
- max(by:) メソッドを使用して、休止が最も多い日のインデックスを決定します。
- 手順 2 で見つかったインデックスを使用して、元の absences 配列の結果を印刷します。
これらの手順を実装すると以下のとおりになります。
let secondHalf = absences.suffix(absences.count / 2)
if let i = secondHalf.indices.max(by: { secondHalf[$0] < secondHalf[$1] }) {
print("Highest second-half absences: \(absences[i])")
}
// Prints "Highest second-half absences: 3"
スライスはコレクションのセマンティクスを継承します
スライスは、その基本コレクションの値または参照セマンティクスを継承します。つまり、配列などの値の意味を持つ変更可能なコレクションのスライスを操作する場合、元のコレクションを変更すると、そのコレクションのコピーをトリガーし、スライスの内容には影響しません。
たとえば、absences 配列の最後の要素を 0 から 2 に更新しても、secondHalf スライスは変更されません。
absences[7] = 2 print(absences) // Prints "[0, 2, 0, 4, 0, 3, 1, 2]" print(secondHalf) // Prints "[0, 3, 1, 0]"
コレクションを横断する
シーケンスは横断されながら消費される可能性がありますが、コレクションは マルチパス であることが保証されています。インデックスを保存することによって、すべての要素に繰り返しアクセスできます。さらに、コレクションのインデックスはコレクションの要素の位置の有限範囲を形成します。すべてのコレクションが有限であるという事実は、contains(_:) メソッドを使用してコレクションが要素を含んでいるかどうかをテストするなど、多くのシーケンス操作の安全性を保証します。
コレクションの要素をその位置で反復処理すると、その反復因子 (iterator) を使用してそのコレクションを反復処理するのと同じ順序で同じ要素が生成されます。この例は、ビューのインデックスまたはビューそれ自体が反復されているかどうかに関わらず、文字列の characters (文字) のビューが同じ文字を同じ順序で返すことを示しています。
let word = "Swift" for character in word { print(character) } // Prints "S" // Prints "w" // Prints "i" // Prints "f" // Prints "t" for i in word.indices { print(word[i]) } // Prints "S" // Prints "w" // Prints "i" // Prints "f" // Prints "t"
Collection プロトコルに準拠
その要素への繰り返しアクセスを提供するカスタムシーケンスを作成する場合は、シーケンスとコレクション操作のためのより便利で効率的なインターフェイスを提供するために、その型が Collection プロトコルに準拠していることを確認してください。あなたの型にコレクションの準拠を追加するには、少なくとも以下の要件を宣言する必要があります。
- startIndex プロパティと endIndex プロパティ
- あなたの型の要素への少なくとも読み取り専用のアクセスを提供するサブスクリプト
- あなたのコレクションにインデックスを進めるための index(after:) メソッド
期待されるパフォーマンス
Collection に準拠する型は、startIndex と endIndex の各プロパティと、O(1) の操作としての要素へのサブスクリプトアクセスを提供することが期待されます。多くのコレクション操作は、独自のパフォーマンス保証のために O(1) サブスクリプトのパフォーマンスに依存しているため、このパフォーマンスを保証できない型は出発点を文書化しなければなりません。
いくつかのコレクション操作のパフォーマンスは、コレクションが提供するインデックスの型によって異なります。例えば、O(1) 時間内の 2 つのインデックス間の距離を測定できる、ランダムアクセスコレクションは、O(1) 時間内のその count プロパティを計算できます。逆に、前方向または双方向のコレクションは、含まれる要素の数をカウントするためにコレクション全体を横断しなければならないため、その count プロパティにアクセスすることは O(n) 操作です。
トピックス
コレクションの要素へのアクセス
subscript(Self.Index) -> Self.Element
指定された位置にある要素にアクセスします。
必須。 デフォルトの実装が提供されます。
要素の選択と除外
func popFirst() -> Self.Element?
コレクションの最初の要素を削除して返します。
func removeFirst() -> Self.Element
コレクションの最初の要素を削除して返します。
指定された数の要素をコレクションの先頭から削除します。
インデックスの操作
空でないコレクション内の最初の要素の位置。
必須。
コレクションの "終わりを過ぎた" 位置、つまり最後の有効なサブスクリプト引数よりも 1 つ大きい位置。
必須。
昇順でコレクションをサブスクリプトするのに有効なインデックス。
必須。 デフォルトの実装が提供されます。
func index(after: Self.Index) -> Self.Index
与えられたインデックスの直後の位置を返します。
必須。
func formIndex(inout Self.Index, offsetBy: Int)
与えられたインデックスを指定された距離だけオフセットします。
func formIndex(inout Self.Index, offsetBy: Int, limitedBy: Self.Index) -> Bool
与えられたインデックスを指定された距離だけオフセットするか、または与えられた制限インデックスと等しくなるようにオフセットします。
func formIndex<T>(inout Self.Index, offsetBy: T)
    廃止  
func formIndex<T>(inout Self.Index, offsetBy: T, limitedBy: Self.Index) -> Bool
    廃止  
コレクションの変換
var lazy: LazyCollection<Self>
このコレクションのビューで、map や filter などの通常の操作の遅延した実装を提供します。
func flatMap((Self.Element) -> String?) -> [String]
    廃止  
関連した型
必須。
コレクション内の位置を表す型。
必須。
昇順でコレクションをサブスクリプト化するために有効なインデックスを表す型。
必須。
コレクションの反復処理インタフェースを提供し、その反復状態をカプセル化する型。
必須。
コレクションの要素の連続した部分範囲を表すシーケンス。
必須。
typealias Collection.IndexDistance
    廃止  
コレクションの要素を反復処理する
func makeIterator() -> Self.Iterator
コレクションの要素の反復因子 (iterator) を返します。
必須。デフォルトの実装が提供されます。
要素の分割と結合
与えられた要素に等しい要素の周りで、コレクションの可能な最長の部分シーケンスを順番に返します。
func joined() -> FlattenCollection<Self>
連結されたコレクション群のこのコレクションの要素を返します。
インスタンスプロパティ
コレクション内の要素の数。
必須。 デフォルトの実装が提供されます。
コレクションの最初の要素。
必須。 デフォルトの実装が提供されます。
コレクションが空であるかどうかを示すブール値。
必須。 デフォルトの実装が提供されます。
インスタンスメソッド
func distance(from: Self.Index, to: Self.Index) -> Int
2 つのインデックス間の距離を返します。
必須。 デフォルトの実装が提供されます。
func firstIndex(of: Self.Element) -> Self.Index?
指定された値がコレクションに表示される最初のインデックスを返します。
func firstIndex(where: (Self.Element) -> Bool) -> Self.Index?
コレクションの要素が与えられた predicate (述語) を満たす最初のインデックスを返します。
func formIndex(after: inout Self.Index)
与えられたインデックスをその後継と置き換えます。
必須。 デフォルトの実装が提供されます。
func index(Self.Index, offsetBy: Int) -> Self.Index
与えられたインデックスから指定された距離のインデックスを返します。
必須。 デフォルトの実装が提供されます。
func index(Self.Index, offsetBy: Int, limitedBy: Self.Index) -> Self.Index?
与えられた限界のインデックスを越えた距離でなければ、与えられたインデックスから指定された距離にあるインデックスを返します。
必須。 デフォルトの実装が提供されます。
func prefix(through: Self.Index) -> Self.SubSequence
コレクションの先頭から指定された位置までの部分シーケンスを返します。
必須。 デフォルトの実装が提供されます。
func prefix(upTo: Self.Index) -> Self.SubSequence
コレクションの先頭から指定された位置までの、それを含まない部分シーケンスを返します。
必須。 デフォルトの実装が提供されます。
func randomElement() -> Self.Element?
コレクションのランダムな要素を返します。
func randomElement<T>(using: inout T) -> Self.Element?
与えられたジェネレータを乱数のソースとして使用して、コレクションのランダムな要素を返します。
func suffix(from: Self.Index) -> Self.SubSequence
指定された位置からコレクションの最後までの部分シーケンスを返します。
必須。 デフォルトの実装が提供されます。
サブスクリプト
subscript(Range<Self.Index>) -> Self.SubSequence
コレクションの要素の連続した部分範囲にアクセスします。
必須。
関連
以下より継承
以下へ継承
- BidirectionalCollection
- LazyCollectionProtocol
- MutableCollection
- RangeReplaceableCollection
以下により採用
- AnyCollection
- Character.UnicodeScalarView
- ClosedRange
- DefaultIndices
- Dictionary
- Dictionary.Keys
- double2
- double3
- double4
- FlattenCollection
- float2
- float3
- float4
- int2
- int3
- int4
- LazyCollection
- LazyDropWhileCollection
- LazyPrefixWhileCollection
- MLDataTable.Row
- MLDataValue.DictionaryType
- Range
- Set
- Slice
- uint2
- uint3
- uint4
- UnsafeBufferPointer
- UnsafeRawBufferPointer
以下も見よ
第一段階
その要素への反復された、連続アクセスを提供する型。