見出し画像

Swiftでプログラミング。 - コレクションの種類 1

Swiftは、値のコレクションを格納するために、配列、セット、および辞書と呼ばれる3つの主要なコレクションタイプを提供します。配列は、順序付けられた値のコレクションです。セットは、一意の値の順序付けられていないコレクションです。ディクショナリは、キーと値の関連付けの順序付けられていないコレクションです。

Swiftの配列、セット、および辞書は、格納できる値とキーのタイプについて常に厳格に決められます。 これは、間違ったタイプの値を誤ってコレクションに挿入できないことを意味します。 また、コレクションから取得する値のタイプを間違って使うことはありません。

Mutability of Collections  コレクションの可変性

配列、セット、またはディクショナリを作成し、それを変数に割り当てると、作成されたコレクションは変更可能になります。 つまり、コレクション内のアイテムを追加、削除、または変更することで、コレクションの作成後にコレクションの中の値を変更することができます。 配列、セット、または辞書を定数に割り当てると、そのコレクションは不変であり、そのサイズと内容を変更することはできません。

コレクションを変更する必要がない場合はすべて、不変のコレクションを作成することをお勧めします。 そうすることで、コードについての推論が容易になり、Swiftコンパイラーが作成するコレクションのパフォーマンスを最適化できるようになります。

Arrays 配列

配列は、同じタイプの値を順序付きリストに格納します。 同じ値が配列の異なる位置に複数回現れる可能性があります。

Swiftの配列型はFoundationのNSArrayクラスにブリッジされます。
FoundationおよびCocoaでのArrayの使用の詳細については、「ArrayとNSArray間のブリッジング」を参照してください。

Array Type Shorthand Syntax 配列型の短縮構文

Swift配列のタイプは、完全にArray <Element>として記述されます。ここで、Elementは、配列に格納できる値のタイプです。 配列の型を[要素]と略記することもできます。 2つの形式は機能的には同じですが、省略形が推奨され、配列のタイプを参照するときにこのガイド全体で使用されます。

Creating an Empty Array 空の配列の作成

初期化構文を使用して、特定のタイプの空の配列を作成できます。

   var someInts = [Int]()
   print("someInts is of type [Int] with \(someInts.count) items.")
   // Prints "someInts is of type [Int] with 0 items."

someInts変数の型は、初期化子の型から[Int]であると推測されることに注意してください。

または、コンテキストが関数の引数やすでに型指定された変数や定数などの型情報をすでに提供している場合は、[ ](角括弧の空のペア)として記述された空の配列リテラルを使用して空の配列を作成できます。

   someInts.append(3)
   // someInts now contains 1 value of type Int
   someInts = []
   // someInts is now an empty array, but is still of type [Int]

Creating an Array with a Default Value デフォルト値で配列を作成する

Swiftの配列型は、すべての値が同じデフォルト値に設定された特定のサイズの配列を作成するための初期化子も提供します。 この初期化子に適切なタイプのデフォルト値(repeating)を渡します:そしてその値が新しい配列で繰り返される回数(count)を決めます:

    var threeDoubles = Array(repeating: 0.0, count: 3)
   // threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]

Creating an Array by Adding Two Arrays Together 2つの配列を一緒に追加して配列を作成する

互換性のあるタイプの2つの既存の配列を加算演算子(+)で加算することにより、新しい配列を作成できます。 新しいarrayのタイプは、一緒に追加した2つのarrayのタイプから推測されます。

   var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
   // anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]
   var sixDoubles = threeDoubles + anotherThreeDoubles
   // sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

Creating an Array with an Array Literal  配列リテラルを使用した配列の作成

配列リテラルを使用して配列を初期化することもできます。これは、1つ以上の値を配列コレクションとして書き込む簡単な方法です。 配列リテラルは、コンマで区切られ、角かっこで囲まれた値のリストとして記述されます。

[値1、値2、値3]

以下の例では、文字列値を格納するためにshoppingListという配列を作成します。

   var shoppingList: [String] = ["Eggs", "Milk"]
   // shoppingList has been initialized with two initial items

ShoppingList変数は、[String]として記述された「文字列値の配列」として宣言されています。この特定の配列は文字列の値型を指定しているため、文字列値のみを格納できます。ここで、shoppingList配列は、配列リテラル内に記述された2つの文字列値(「Eggs」と「Milk」)で初期化されます。

以下の例では、買い物リストにさらにアイテムが追加されるため、shoppingList配列は、定数(letイントロデューサーを使用)ではなく、変数(varイントロデューサーを使用)として宣言されます。

この場合、配列リテラルには2つの文字列値のみが含まれます。これは、shoppingList変数の宣言のタイプ(文字列値のみを含むことができる配列)と一致するため、2つの初期項目でshoppingListを初期化する方法として、配列リテラルの割り当てが許可されます。

Swiftの型推論のおかげで、同じ型の値を含む配列リテラルで配列を初期化する場合は、配列の型を記述する必要はありません。代わりに、shoppingListの初期化をより短い形式で記述することができます。

var shoppingList = ["Eggs", "Milk"]

配列リテラルのすべての値は同じ型であるため、Swiftは[String]がshoppingList変数に使用する正しい型であると推測できます。

Accessing and Modifying an Array 配列へのアクセスと変更

メソッドとプロパティを使用、または添え字構文を使用して、配列にアクセスして変更します。

配列内のアイテムの数を確認するには、読み取り専用のcountプロパティを使います。

   print("The shopping list contains \(shoppingList.count) items.")
   // Prints "The shopping list contains 2 items."

countプロパティが0に等しいかどうかを確認するためのショートカットとして、Boolean"isEmpty"プロパティを使用します。

   if shoppingList.isEmpty {
       print("The shopping list is empty.")
   } else {
       print("The shopping list isn't empty.")
   }
   // Prints "The shopping list isn't empty."

配列のappend(_ :)メソッドを呼び出すことにより、配列の最後に新しいアイテムを追加できます。

   shoppingList.append("Flour")
   // shoppingList now contains 3 items, and someone is making pancakes

または、追加代入演算子(+ =)を使用して、1つ以上の互換性のあるアイテムの配列を追加します。

   shoppingList += ["Baking Powder"]
   // shoppingList now contains 4 items
   shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
   // shoppingList now contains 7 items

配列の名前の直後に角括弧内で取得する値のインデックスを渡して、添え字構文を使用して配列から値を取得します。

   var firstItem = shoppingList[0]
   // firstItem is equal to "Eggs"
配列の最初の項目のインデックスは1ではなく0です。Swiftの配列は常にゼロインデックスです。

添え字構文を使用して、特定のインデックスの既存の値を変更できます。

   shoppingList[0] = "Six eggs"
   // the first item in the list is now equal to "Six eggs" rather than "Eggs"

添え字構文を使用する場合、指定するインデックスは有効である必要があります。 たとえば、shoppingList [shoppingList.count] = "Salt"と記述して、配列の最後にアイテムを追加しようとすると、ランタイムエラーが発生します。

置換する値のセットの長さが置換する範囲と異なる場合でも、添え字構文を使用して値の範囲を一度に変更することもできます。 次の例では、「Chocolate Spread」、「Cheese」、「Butter」を「Bananas」と「Apples」に置き換えています。

   shoppingList[4...6] = ["Bananas", "Apples"]
   // shoppingList now contains 6 items

指定したインデックスで配列にアイテムを挿入するには、配列のinsert(_:at :)メソッドを呼び出します。

   shoppingList.insert("Maple Syrup", at: 0)
   // shoppingList now contains 7 items
   // "Maple Syrup" is now the first item in the list

このinsert(_:at :)メソッドの呼び出しは、買い物リストの最初に、インデックス0で示される「メープルシロップ」の値を持つ新しいアイテムを挿入します。

同様に、remove(at :)メソッドを使用して配列からアイテムを削除します。 このメソッドは、指定されたインデックスのアイテムを削除し、削除されたアイテムを返します(ただし、必要がない場合は戻り値を無視できます)。

   let mapleSyrup = shoppingList.remove(at: 0)
   // the item that was at index 0 has just been removed
   // shoppingList now contains 6 items, and no Maple Syrup
   // the mapleSyrup constant is now equal to the removed "Maple Syrup" string
配列の既存の境界の外側にあるインデックスの値にアクセスまたは変更しようとすると、ランタイムエラーが発生します。 インデックスを使用する前に、配列のcountプロパティと比較することで、インデックスが有効であることを確認できます。 配列はゼロからインデックス付けされるため、配列内の最大の有効なインデックスはcount-1です。ただし、countが0(配列が空であることを意味する)の場合、有効なインデックスはありません。

アイテムが削除されると、配列内のギャップはすべて閉じられるため、インデックス0の値は再び「6個の卵」に等しくなります。

   firstItem = shoppingList[0]
   // firstItem is now equal to "Six eggs"

配列から最後のアイテムを削除する場合は、remove(at :)メソッドではなくremoveLast()メソッドを使用して、配列のcountプロパティをクエリする必要をなくします。 remove(at :)メソッドと同様に、removeLast()は削除されたアイテムを返します。

   let apples = shoppingList.removeLast()
   // the last item in the array has just been removed
   // shoppingList now contains 5 items, and no apples
   // the apples constant is now equal to the removed "Apples" string

Iterating Over an Array 配列の反復

for-inループを使用して、配列内の値のセット全体を反復処理できます。

   for item in shoppingList {
       print(item)
   }
   // Six eggs
   // Milk
   // Flour
   // Baking Powder
   // Bananas

各項目の整数インデックスとその値が必要な場合は、代わりにenumerated()メソッドを使用して配列を反復処理します。 配列内のアイテムごとに、enumerated()メソッドは整数とアイテムで構成されるタプルを返します。 整数はゼロから始まり、アイテムごとに1ずつカウントアップします。 配列全体を列挙すると、これらの整数はアイテムのインデックスと一致します。 反復の一部として、タプルを一時的な定数または変数に分解できます。

   for (index, value) in shoppingList.enumerated() {
       print("Item \(index + 1): \(value)")
   }
   // Item 1: Six eggs
   // Item 2: Milk
   // Item 3: Flour
   // Item 4: Baking Powder
   // Item 5: Bananas


この記事が気に入ったらサポートをしてみませんか?