文書   >   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]



あなたは、セッションの後半に休止の多い日を見つけることを任されています。問題の日のインデックスを見つけるには、以下の手順を実行します。


  1. 後半の日を保持する abseences 配列のスライスを作成します。

  2. max(by:) メソッドを使用して、休止が最も多い日のインデックスを決定します。

  3. 手順 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 プロトコルに準拠していることを確認してください。あなたの型にコレクションの準拠を追加するには、少なくとも以下の要件を宣言する必要があります。


期待されるパフォーマンス


Collection に準拠する型は、startIndexendIndex の各プロパティと、O(1) の操作としての要素へのサブスクリプトアクセスを提供することが期待されます。多くのコレクション操作は、独自のパフォーマンス保証のために O(1) サブスクリプトのパフォーマンスに依存しているため、このパフォーマンスを保証できない型は出発点を文書化しなければなりません。


いくつかのコレクション操作のパフォーマンスは、コレクションが提供するインデックスの型によって異なります。例えば、O(1) 時間内の 2 つのインデックス間の距離を測定できる、ランダムアクセスコレクションは、O(1) 時間内のその count プロパティを計算できます。逆に、前方向または双方向のコレクションは、含まれる要素の数をカウントするためにコレクション全体を横断しなければならないため、その count プロパティにアクセスすることは O(n) 操作です。


トピックス





コレクションの要素へのアクセス





要素の選択と除外





インデックスの操作





コレクションの変換





関連した型





コレクションの要素を反復処理する





要素の分割と結合





インスタンスプロパティ





インスタンスメソッド





サブスクリプト


関連





以下より継承


Sequence





以下へ継承






以下により採用


以下も見よ




第一段階





目次
Xcode の新機能

  • SDK
  • Xcode 8.0+
  • フレームワーク
  • Swift 標準ライブラリ
  • 概要
  • トピックス
  • 関連
  • 以下も見よ












  • トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)