辞書は、順序を持たないコレクション で、同じ型のキーと同じ型の値との関連を格納します。各値はユニークなキーで関連付けられ、辞書内での値の id となります。配列の値と異なり、辞書には順序の指定がありません。特定の単語の意味を調べるために使われる、現実の世界での辞書と同じように、id で値を調べる必要があるときに辞書を使用します。

NOTE

Swift の Dictionary 型は、Foundation の NSDictionary クラスとつながっています。

Foundation と Cocoa での Dictionary の使用についての詳細は、『Using Swift with Cocoa and Objective-C』を確認してください。

辞書型の簡略シンタックス

Swift での辞書の型は、Key が辞書のキーとして使用する型で、Value が辞書のキーに対して格納する値の型としたとき、 Dictionary<Key, Value> と記述します。

NOTE
辞書の Key は、集合の値の型と同様に、Hashable プロトコルに準拠した型である必要があります。

辞書の型を [Key: Value] と簡略して書くこともできます。2 つの形式は機能的には同じですが、簡略形式のほうが好ましく、このガイドでは全体をとおして辞書の型を参照するときに簡略形式を用いています。

空辞書を生成

配列と同様に、イニシャライザシンタックスを使用して、型を持つ空の辞書を生成することができます。

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

この例は、整数値ごとに名前を格納する [Int: String] 型の空辞書を生成しています。キーは Int 型で、値は String 型です。

前後関係からすでに型の情報がわかっている場合には、空の辞書リテラル [:](角括弧一組の中にコロン)で空辞書を生成することができます。

namesOfIntegers[16] = "sixteen"
// namesOfIntegers にはキーと値のペアが一組ある
namesOfIntegers = [:]
// namesOfIntegers は再び [Int: String] 型の空辞書

辞書リテラルで辞書を生成

配列リテラルと似たシンタックスを辞書リテラルで、辞書を初期化することができます。辞書リテラルは、Dictionary コレクションとして 1 組以上のキーと値のペアを記述します。

キーと値のペア (key-value pair) は、キーと値の組み合わせです。辞書リテラルでは、各ペアのキーと値をコロンで区切ります。キーと値のペアをカンマで区切るリストとして記述し、角括弧で囲みます。

[key 1: value 1, key 2: value 2, key 3: value 3]

次の例では、国際空港の名前を格納する辞書を生成しています。この辞書では、キーは 3 文字の国際航空運送協会 (IATA) コードで、値は空港名です。

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

辞書 airports は、[String: String] 型、つまり「キーが String 型で、値も String 型の Dictionary」として宣言されています。

NOTE
辞書 airports は、以降の例で空港が追加されるため、定数 (let) ではなく、変数 (var) で宣言されています。

辞書 airports は、キーと値のペアが二組の辞書リテラルで初期化されています。初めのペアは、キーが "YYZ" で、値が "Toronto Pearson" です。次のペアは、キーが "DUB"で、値が "Dublin" です。

この辞書リテラルは、String: String のペアが二組です。変数 airports の宣言(String キーと String 値の辞書)と型が一致しているため、辞書リテラルを代入して airports を初期化することができます。

配列と同様に、同じ型のキーと値を持つ辞書リテラルで初期化する場合には、辞書の型を記述する必要はありません。airports の初期化を、より短い形式で記述することができます。

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

リテラル内のすべてのキーが同じ型で、すべての値が同じ型であるため、Swift は辞書 airports の正しい型が [String: String] であると推論することができます。

辞書のアクセスおよび変更

辞書のメソッドやプロパティ、あるいはサブスクリプトシンタックスを利用して、辞書にアクセス、または辞書を変更します。

配列と同様に、辞書内の件数は、読み取り専用の 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"
// 辞書 airports にはペアが 3 組

特定のキーに関連する値を変更するためにサブスクリプトシンタックスを利用することもできます。

airports["LHR"] = "London Heathrow"
// "LHR" の値は "London Heathrow" に変更されている

サブスクリプトに代わる手段として、特定のキーの値を設定または更新するために、辞書の updateValue(_:forKey:) メソッドを使用します。サブスクリプトの例と同様に、updateValue(_:forKey:) メソッドはキーが無い場合には値を設定し、すでにキーがある場合には値を更新します。サブスクリプトと異なり、updateValue(_:forKey:) メソッドは更新後に古い値を返します。これにより、更新が起きたかを確認することができます。

updateValue(_:forKey:) メソッドは、辞書の値の型のオプショナル値を返します。例として、String 値を格納する辞書では、メソッドは 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"
// "Apple International" は APL の実際の空港ではないため削除
airports["APL"] = nil
// APL は辞書から削除されている

あるいは、辞書からキーと値のペアを removeValueForKey(_:) メソッドで削除します。このメソッドはキーと値のペアがある場合には削除して値を返し、値が無い場合には nil を返します。

if let removedValue = airports.removeValueForKey("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." と出力

辞書内を繰り返し処理

辞書内のキーと値のペアを、forin ループで繰り返し処理することができます。辞書の各項目は (key, value) のタプルとして返され、繰り返しでの一時的な定数にタプルのメンバーを分解することができます。

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

forin ループについての詳細は、For Loops を確認してください。

辞書の keys および values プロパティにアクセスして、キーまたは値を繰り返し処理するためのコレクションを取得することもできます。

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

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

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

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

let airportNames = [String](airports.values)
// airportNames は ["Toronto Pearson", "London Heathrow"]

Swift の Dictionary 型は順序を持ちません。辞書のキーまたは値を特定の順に繰り返し処理するには、sort() メソッドを keys または values プロパティに使用します。


Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.