Swift 言語ガイド – 4. コレクション型

swift

はじめに

公式ページのSwift 言語ガイド「The Swift Programming Language Swift 5.3」に基づき記載いたします。本ページでは、「コレクション型」について記載いたします。
記載内容に誤り等ございましたら、ご連絡をいただければ幸いです。

4. コレクション型

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

Swiftの配列、セット、および辞書は、格納できる値とキーのタイプについて常に明確です。これは、間違った型の値を誤ってコレクションに挿入できないことを意味します。また、コレクションから取得する値の型に自信を持つことができることも意味します。

注意
Swiftの配列、セット、および辞書の型は、ジェネリックコレクションとして実装されています。ジェネリック型とコレクションの詳細については、ジェネリックスを参照してください。

4.1. コレクションの可変性

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

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

4.2. 配列

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

注意
Swiftの配列型はFoundationのNSArrayクラスにブリッジされます。

FoundationおよびCocoaでのArrayの使用の詳細については、「ArrayとNSArray間のブリッジング」を参照してください。

4.2.1. 配列型の短縮構文

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

4.2.2. 空の配列の作成

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

var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// "someInts is of type [Int] with 0 items."を出力します。

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

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

someInts.append(3)
// someIntsにInt型の値が1つ含まれるようになりました
someInts = []
// someIntsは空の配列になりましたが、型は[Int]のままです。

4.2.3. デフォルト値での配列の作成

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

var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoublesの型は[Double]で、[0.0、0.0、0.0]と同じです。

4.2.4. 2つの配列を一緒に追加して配列を作成

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

var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoublesの型は[Double]で[2.5, 2.5, 2.5]に等しくなります。

var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoublesは[Double]として推測され、[0.0、0.0、0.0、2.5、2.5、2.5]に等しくなります。

4.2.5. 配列リテラルを使用した配列の作成

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

[value 1, value 2, value 3]

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

var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingListは2つの初期アイテムで初期化されています

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

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

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

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

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

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

4.2.6. 配列へのアクセスと変更

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

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

print("The shopping list contains \(shoppingList.count) items.")
// "The shopping list contains 2 items."を出力します。

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

if shoppingList.isEmpty {
    print("The shopping list is empty.")
} else {
    print("The shopping list is not empty.")
}
// "The shopping list is not empty."を出力します。

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

shoppingList.append("Flour")
// ShoppingListには3つのアイテムが含まれ、誰かがパンケーキを作っています

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

shoppingList += ["Baking Powder"]
// ShoppingListに4つのアイテムが含まれるようになりました
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// ShoppingListに7つのアイテムが含まれるようになりました

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

var firstItem = shoppingList[0]
// firstItemは"Eggs"に等しくなります。

注意
配列の最初の項目のインデックスは1ではなく0です。Swiftの配列は常にゼロインデックスです。

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

shoppingList[0] = "Six eggs"
// リストの最初の項目は、「Eggs」ではなく「Sixeggs」に等しくなりました。

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

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

shoppingList[4...6] = ["Bananas", "Apples"]
// ShoppingListに6つのアイテムが含まれるようになりました

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

shoppingList.insert("Maple Syrup", at: 0)
// ShoppingListに7つのアイテムが含まれるようになりました
// "Maple Syrup"はリストの最初のアイテムになりました

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

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

let mapleSyrup = shoppingList.remove(at: 0)
// インデックス0にあったアイテムが削除されました
// ShoppingListには6つのアイテムが含まれ、メープルシロップは含まれていません
// mapleSyrup定数は、削除された「MapleSyrup」文字列と等しくなりました

注意
配列の既存の境界外にあるインデックスの値にアクセスまたは変更しようとすると、ランタイムエラーが発生します。インデックスを使用する前に、配列のcountプロパティと比較することで、インデックスが有効であることを確認できます。配列はゼロからインデックス付けされるため、配列内の最大の有効なインデックスはcount-1です。ただし、countが0(配列が空であることを意味する)の場合、有効なインデックスはありません。

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

firstItem = shoppingList[0]
// firstItemは"Six eggs"に等しくなります

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

let apples = shoppingList.removeLast()
// 配列の最後のアイテムが削除されました
// ShoppingListには5つのアイテムが含まれ、リンゴは含まれていません
// apples定数は、削除された"Apples"文字列と等しくなります

4.2.7. 配列の反復

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

for-inループの詳細については、「For-Inループ」を参照してください。

4.3. セット

セットは、同じ型の個別の値を、定義された順序なしでコレクションに格納します。アイテムの順序が重要でない場合、またはアイテムが1回だけ表示されるようにする必要がある場合は、配列の代わりにセットを使用できます。

注意
SwiftのSet型は、FoundationのNSSetクラスにブリッジされます。

FoundationとCocoaでSetを使用する方法の詳細については、SetとNSSet間のブリッジングを参照してください。

4.3.1. セット型のハッシュ値

型は、セットに格納されるためにハッシュ可能である必要があります。つまり、型は、それ自体のハッシュ値を計算する方法を提供する必要があります。ハッシュ値は、等しく比較するすべてのオブジェクトで同じInt値であり、a == bの場合、aのハッシュ値はbのハッシュ値と等しくなります。

Swiftのすべての基本型(String、Int、Double、Boolなど)はデフォルトでハッシュ可能であり、設定値型または辞書キー型として使用できます。(列挙で説明されているように)関連付けられた値のない列挙ケース値も、デフォルトでハッシュ可能です。

注意
Swift標準ライブラリのHashableプロトコルに準拠させることで、独自のカスタム型を設定値の型または辞書キーの型として使用できます。必要なhash(into:)メソッドの実装については、Hashableを参照してください。プロトコルへの準拠については、「プロトコル」を参照してください。

4.3.2. セット型の構文

Swiftのセットの型は、Setとして記述されます。ここで、Elementは、セットが格納できる型です。配列とは異なり、セットには同等の省略形はありません。

4.3.3. 空のセットの作成と初期化

初期化構文を使用して、特定の型の空のセットを作成できます。

var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// "letters is of type Set<Character> with 0 items."を出力します

注意
文字変数の型は、初期化子の型からSetであると推測されます。

または、コンテキストが関数の引数やすでに型指定された変数や定数などの型情報をすでに提供している場合は、空の配列リテラルを使用して空のセットを作成できます。

letters.insert("a")
// 文字に文字型の値が1つ含まれるようになりました
letters = []
// 文字は空のセットになりましたが、型はSet <Character>のままです

4.3.4. 配列リテラルを使用したセットの作成

1つ以上の値をセットコレクションとして書き込む簡単な方法として、配列リテラルを使用してセットを初期化することもできます。

以下の例では、文字列値を格納するためのfavoriteGenresというセットを作成します。

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenresは3つの初期アイテムで初期化されました

favoriteGenres変数は、Setとして記述された「文字列値のセット」として宣言されます。この特定のセットは文字列の値型を指定しているため、文字列値のみを格納できます。ここで、favoriteGenresセットは、配列リテラル内に記述された3つの文字列値( “Rock”、 “Classical”、および “Hip hop”)で初期化されます。

注意
以下の例では項目が追加および削除されるため、favoriteGenresセットは定数(letイントロデューサーを使用)ではなく変数(varイントロデューサーを使用)として宣言されます。

配列リテラルだけからセットの型を推測することはできないため、タイプセットを明示的に宣言する必要があります。ただし、Swiftの型推論のため、1つの型の値のみを含む配列リテラルで初期化する場合は、セットの要素の型を記述する必要はありません。代わりに、favoriteGenresの初期化を短い形式で記述できます。

var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

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

4.3.5. セットへのアクセスと変更

セットにアクセスして変更するには、そのメソッドとプロパティを使用します。

セット内のアイテムの数を確認するには、その読み取り専用のcountプロパティを確認してください。

print("I have \(favoriteGenres.count) favorite music genres.")
// "I have 3 favorite music genres."を出力します

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

if favoriteGenres.isEmpty {
    print("As far as music goes, I'm not picky.")
} else {
    print("I have particular music preferences.")
}
// "I have particular music preferences."を出力します

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

favoriteGenres.insert("Jazz")
// FavoriteGenresには4つのアイテムが含まれるようになりました

セットのremove(_:)メソッドを呼び出すことで、セットからアイテムを削除できます。このメソッドは、アイテムがセットのメンバーである場合はアイテムを削除し、削除された値を返します。セットに含まれていない場合はnilを返します。または、removeAll()メソッドを使用して、セット内のすべてのアイテムを削除することもできます。

if let removedGenre = favoriteGenres.remove("Rock") {
    print("\(removedGenre)? I'm over it.")
} else {
    print("I never much cared for that.")
}
// "Rock? I'm over it."を出力します

セットに特定のアイテムが含まれているかどうかを確認するには、contains(_:)メソッドを使用します。

if favoriteGenres.contains("Funk") {
    print("I get up on the good foot.")
} else {
    print("It's too funky in here.")
}
// "It's too funky in here."を出力します

4.3.6. セットの反復

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

for genre in favoriteGenres {
    print("\(genre)")
}
// Classical
// Jazz
// Hip hop

for-inループの詳細については、「For-Inループ」を参照してください。

SwiftのSet型には、定義された順序がありません。セットの値を特定の順序で反復処理するには、sorted()メソッドを使用します。このメソッドは、<演算子を使用してソートされた配列としてセットの要素を返します。

for genre in favoriteGenres.sorted() {
    print("\(genre)")
}
// Classical
// Hip hop
// Jazz

4.3.7. セット操作の実行

2つのセットを組み合わせる、2つのセットに共通する値を判別する、2つのセットに同じ値がすべて含まれるか、一部含まれるか、含まれないかを判別するなど、基本的なセット操作を効率的に実行できます。

4.3.7.1. 基本的なセット操作

次の図は、2つのセット(aとb)を示しており、さまざまなセット操作の結果が影付きの領域で表されています。

  • intersection(:)メソッドを使用して、両方のセットに共通の値のみを含む新しいセットを作成します。
  • symmetricDifference(:)メソッドを使用して、両方ではなくいずれかのセットの値を持つ新しいセットを作成します。
  • union(:)メソッドを使用して、両方のセットのすべての値を含む新しいセットを作成します。
  • subtracting(:)メソッドを使用して、指定されたセットにない値で新しいセットを作成します。
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
4.3.7.2. メンバーシップと平等の設定

次の図は、a、b、cの3つのセットを示しており、重複する領域はセット間で共有される要素を表しています。aにはbのすべての要素が含まれているため、セットaはセットbのスーパーセットです。逆に、bのすべての要素もaに含まれているため、セットbはセットaのサブセットです。セットbとセットcは、共通の要素を共有していないため、互いに素です。

  • “is equal”演算子(==)を使用して、2つのセットにすべて同じ値が含まれているかどうかを判別します。
  • isSubset(of:)メソッドを使用して、セットのすべての値が指定されたセットに含まれているかどうかを判別します。
  • isSuperset(of:)メソッドを使用して、セットに指定されたセットのすべての値が含まれているかどうかを判別します。
  • isStrictSubset(of:)またはisStrictSuperset(of:)メソッドを使用して、セットがサブセットまたはスーパーセットであるが、指定されたセットと等しくないかどうかを判別します。
  • isDisjoint(with:)メソッドを使用して、2つのセットに共通の値がないかどうかを判別します。
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]

houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true

4.4. 辞書

辞書は、同じ型のキーと同じ型の値の間の関連付けを、定義された順序なしでコレクションに格納します。各値は一意のキーに関連付けられており、辞書内でその値の識別子として機能します。配列内のアイテムとは異なり、辞書内のアイテムには指定された順序がありません。識別子に基づいて値を検索する必要がある場合は、実際の辞書を使用して特定の単語の定義を検索するのとほぼ同じ方法で、辞書を使用します。

注意
Swiftの辞書タイプはFoundationのNSDictionaryクラスにブリッジされます。

FoundationとCocoaでDictionaryを使用する方法の詳細については、DictionaryとNSDictionary間のブリッジングを参照してください。

4.4.1. 辞書型省略構文

Swiftの辞書型は、Dictionaryとして記述されます。ここで、Keyは辞書のキーとして使用できる値の型であり、Valueは辞書がそれらのキーに対して格納する値の型です。

注意
辞書のキーの型は、セットの値型と同様に、ハッシュ可能なプロトコルに準拠している必要があります。

辞書の型を[Key:Value]のように省略形で記述することもできます。2つの形式は機能的に同じですが、省略形が推奨され、辞書の型を参照するときにこのガイド全体で使用されます。

4.4.2. 空の辞書の作成

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

var namesOfIntegers = [Int: String]()
// namesOfIntegersは空の[Int:String]辞書です

この例では、[Int:String]型の空の辞書を作成して、人間が読み取れる整数値の名前を格納します。そのキーはInt型であり、値はString型です。

コンテキストがすでに型情報を提供している場合は、空の辞書リテラルを使用して空の辞書を作成できます。これは、[:](角括弧のペア内のコロン)として記述されます。

namesOfIntegers[16] = "sixteen"
// namesOfIntegersに1つのキーと値のペアが含まれるようになりました
namesOfIntegers = [:]
// namesOfIntegersは、[Int:String]型の空の辞書です

4.4.3. 辞書リテラルを使用した辞書の作成

また、前に見た配列リテラルと同様の構文を持つ辞書リテラルを使用して辞書を初期化することもできます。辞書リテラルは、1つ以上のキーと値のペアを辞書コレクションとして記述するための簡単な方法です。

キーと値のペアは、キーと値の組み合わせです。辞書リテラルでは、各キーと値のペアのキーと値はコロンで区切られます。キーと値のペアは、コンマで区切られ、角かっこで囲まれたリストとして記述されます。

[キー1:値1、キー2:値2、キー3:値3]

以下の例では、国際空港の名前を格納するための辞書を作成します。この辞書では、キーは3文字の国際航空運送協会のコードであり、値は空港名です。

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

空港辞書は、型が[String:String]であると宣言されています。これは、「キーがString型であり、値もString型である辞書」を意味します。

注意
以下の例では、より多くの空港がディクショナリに追加されているため、空港ディクショナリは定数(letイントロデューサを使用)ではなく変数(varイントロデューサを使用)として宣言されています。

空港辞書は、2つのキーと値のペアを含む辞書リテラルで初期化されます。最初のペアのキーは「YYZ」で、値は「TorontoPearson」です。2番目のペアのキーは「DUB」で、値は「Dublin」です。

この辞書リテラルには、2つの文字列:文字列ペアが含まれています。このKey-Value型は、airports変数宣言の型(Stringキーのみ、String値のみの辞書)と一致するため、2つの初期項目でairports辞書を初期化する方法として、辞書リテラルの割り当てが許可されます。

配列と同様に、キーと値の型が一貫している辞書リテラルで初期化する場合は、辞書の型を記述する必要はありません。空港の初期化は、代わりに短い形式で記述されている可能性があります。

var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

リテラル内のすべてのキーは互いに同じ型であり、同様にすべての値は互いに同じ型であるため、Swiftは[String:String]が空港辞書に使用する正しいタイプであると推測できます。

4.4.4. 辞書へのアクセスと変更

辞書にアクセスして変更するには、そのメソッドとプロパティを使用するか、添え字構文を使用します。

配列の場合と同様に、読み取り専用のcountプロパティを確認することで、ディクショナリ内のアイテムの数を確認できます。

print("The airports dictionary contains \(airports.count) items.")
// "The airports dictionary contains 2 items."を出力します

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

if airports.isEmpty {
    print("The airports dictionary is empty.")
} else {
    print("The airports dictionary is not empty.")
}
// "The airports dictionary is not empty."を出力します

添え字構文を使用して、辞書に新しい項目を追加できます。適切な型の新しいキーを添え字インデックスとして使用し、適切な型の新しい値を割り当てます。

airports["LHR"] = "London"
// 空港辞書に3つの項目が含まれるようになりました

添え字構文を使用して、特定のキーに関連付けられている値を変更することもできます。

airports["LHR"] = "London Heathrow"
// 「LHR」の値が「LondonHeathrow」に変更されました

添え字を付ける代わりに、辞書のupdateValue(:forKey:)メソッドを使用して、特定のキーの値を設定または更新します。上記の添え字の例のように、updateValue(:forKey:)メソッドは、キーが存在しない場合は値を設定し、キーがすでに存在する場合は値を更新します。ただし、添え字とは異なり、updateValue(_:forKey:)メソッドは、更新の実行後に古い値を返します。これにより、更新が行われたかどうかを確認できます。

updateValue(_:forKey:)メソッドは、辞書の値の型のオプショナルの値を返します。たとえば、文字列値を格納する辞書の場合、メソッドはString?型の値または「オプショナルのString」を返します。このオプショナルの値には、更新前にキーが存在していた場合はそのキーの古い値が含まれ、値が存在しなかった場合はnilが含まれます。

if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
    print("The old value for DUB was \(oldValue).")
}
// "The old value for DUB was Dublin."を出力します

添え字構文を使用して、特定のキーの辞書から値を取得することもできます。値が存在しないキーを要求できるため、辞書の添え字は、辞書の値の型のオプショナルの値を返します。辞書に要求されたキーの値が含まれている場合、添え字はそのキーの既存の値を含むオプショナルの値を返します。 それ以外の場合、添え字はnilを返します。

if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName).")
} else {
    print("That airport is not in the airports dictionary.")
}
// "The name of the airport is Dublin Airport."を出力します

添え字構文を使用して、キーにnilの値を割り当てることにより、キーと値のペアを辞書から削除できます。

airports["APL"] = "Apple International"
// "AppleInternational"はAPLの実際の空港ではないため、削除します
airports["APL"] = nil
// APLが辞書から削除されました

または、removeValue(forKey:)メソッドを使用して、辞書からキーと値のペアを削除します。このメソッドは、キーと値のペアが存在する場合は削除して削除した値を返し、値が存在しない場合はnilを返します。

if let removedValue = airports.removeValue(forKey: "DUB") {
    print("The removed airport's name is \(removedValue).")
} else {
    print("The airports dictionary does not contain a value for DUB.")
}
// "The removed airport's name is Dublin Airport."を出力します

4.4.5. 辞書の反復処理

for-inループを使用して、辞書内のキーと値のペアを反復処理できます。辞書内の各アイテムは(キー、値)タプルとして返され、反復の一部としてタプルのメンバーを一時的な定数または変数に分解できます。

for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
// LHR: London Heathrow
// YYZ: Toronto Pearson

for-inループの詳細については、「For-Inループ」を参照してください。

キーと値のプロパティにアクセスして、辞書のキーまたは値の反復可能なコレクションを取得することもできます。

for airportCode in airports.keys {
    print("Airport code: \(airportCode)")
}
// Airport code: LHR
// Airport code: YYZ

for airportName in airports.values {
    print("Airport name: \(airportName)")
}
// Airport name: London Heathrow
// Airport name: Toronto Pearson

Arrayインスタンスを取得するAPIで辞書のキーまたは値を使用する必要がある場合は、keysまたはvaluesプロパティを使用して新しい配列を初期化します。

let airportCodes = [String](airports.keys)
// AirportCodesは["LHR"、 "YYZ"]

let airportNames = [String](airports.values)
// AirportNamesは["LondonHeathrow"、 "Toronto Pearson"]

Swiftの辞書型には定義された順序がありません。辞書のキーまたは値を特定の順序で反復処理するには、そのキーまたは値プロパティでsorted()メソッドを使用します。

タイトルとURLをコピーしました