文書   >   Swift   >   Dictionary
汎用構造体
Dictionary
その要素がキー値のペアであるコレクション。
宣言
概要
dictionary (辞書) はハッシュテーブルの一つの型で、含まれるエントリへの高速アクセスを提供します。テーブル内の各エントリは、そのキーを使用して識別され、キーは、文字列や数字などのハッシュ可能な型です。そのキーを使用して、対応する値を取得します。値は、任意のオブジェクトにすることができます。他の言語では、同様のデータ型はハッシュまたは関連配列として知られています。
dictionary リテラルを使用して、新しい dictionary を作成します。 辞書リテラルは、キー値のペアのコンマ区切りリストであり、ここでコロンは角括弧で囲まれた関連する値から各キーをコロンで区切ります。dictionary リテラルを変数または定数に割り当てるか、 dictionary を必要とする関数に渡すことができます。
HTTP 応答コードとその関連メッセージの辞書 (dictionary) を作成する方法は次のとおりです。
var responseMessages = [200: OK", 403: "Access forbidden", 404: "File not found", 500: "Internal server error"]
responseMessages 変数は、型[Int:String] を持つと推測されます。Dictionary のキー型は Int で、dictionary の Value 型は String です。
キー値のペアを持たない dictionary を作成するには、空の辞書リテラル ([:]) を使用します。
var emptyDict: [String: String] = [:]
Swift のすべての基本型を含む、Hashable プロトコルに準拠する全ての型は、dictionary の Key 型として使用できます。Hashable プロトコルにそれらを準拠させることで、独自のカスタム型を dictionary キーとして使用できます。
辞書の値の取得と設定
辞書内の値にアクセスする最も一般的な方法は、キーをサブスクリプトとして使用することです。キーを使用したサブスクリプトの形式は以下のとおりです。
print(responseMessages[200])
// Prints "Optional("OK")"
dictionary (辞書) にはサブスクリプトで使用するキーの値が保持されない場合があるため、キーを使用して dictionary (辞書) にサブスクリプトを実行すると、optional の値が返されます。
次の例では、responseMessages dictionary (辞書) のキーを基礎にしたサブスクリプトを使用し、dictionary (辞書) に存在する 2 つのキーと存在しないキーを1つ使用します。
let httpResponseCodes = [200, 403, 301]
for code in httpResponseCodes {
if let message = responseMessages[code] {
print("Response \(code): \(message)")
} else {
print("Unknown response \(code)")
}
}
// Prints "Response 200: OK"
// Prints "Response 403: Access Forbidden"
// Prints "Unknown response 301"
キーを基礎にしたサブスクリプトを使用して、dictionary (辞書) からのキーと値を更新、変更、または削除することもできます。新しいキー値のペアを追加するには、まだ辞書の一部に含まれていないキーに値を割り当てます。
responseMessages[301] = "Moved permanently"
print(responseMessages[301])
// Prints "Optional("Moved permanently")"
dictionary (辞書) にすでに存在するキーに新しい値を割り当てることにより、既存の値を更新します。既存のキーに nil を割り当てると、キーとそれに関連した値が削除されます。以下の例では、404 コードの値を単に "Not found" に更新し、500 コードのキー値のペアを完全に削除します。
responseMessages[404] = "Not found"
responseMessages[500] = nil
print(responseMessages)
// Prints "[301: "Moved permanently", 200: "OK", 403: "Access forbidden", 404: "Not found"]"
可変 Dictionary インスタンスでは、キー付きサブスクリプトを使用してアクセスした値をその場で変更できます。以下のコードサンプルは、interestingNumbers という名前の辞書を、整数の配列である文字列キーと値で宣言し、各配列をその場で降順に並べ替えます。
var interestingNumbers = ["primes": [2, 3, 5, 7, 11, 13, 17],
"triangular": [1, 3, 6, 10, 15, 21, 28],
"hexagonal": [1, 6, 15, 28, 45, 66, 91]]
for key in interestingNumbers.keys {
interestingNumbers[key]?.sort(by: >)
}
print(interestingNumbers["primes"]!)
// Prints "[17, 13, 11, 7, 5, 3, 2]"
辞書の内容を反復処理する
すべての辞書は、キー値のペアの順序付けられていないコレクションです。for-in ループを使用して辞書を反復処理し、各キー値のペアをタプルの要素に分解できます。
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
for (name, path) in imagePaths {
print("The path to '\(name)' is '\(path)'.")
}
// Prints "The path to 'star' is '/glyphs/star.png'."
// Prints "The path to 'portrait' is '/images/content/portrait.jpg'."
// Prints "The path to 'spacer' is '/images/shared/spacer.gif'."
辞書内のキー値のペアの順序は、変異の間で安定していますが、それ以外の場合は予測できません。キー値のペアの順序付けられたコレクションが必要で、Dictionary が提供する高速なキーのルックアップが必要ない場合は、KeyValuePairs 型を代わりに参照してください。
デフォルトの実装で提供されている contains(where:) または firstIndex(where:) メソッドを使用して、特定の値について辞書の内容を検索できます。以下の例では、imagePaths に "/glyphs" ディレクトリでいくつかのパスが含まれているかどうかを確認します。
let glyphIndex = imagePaths.firstIndex(where: { $0.value.hasPrefix("/glyphs") })
if let index = glyphIndex {
print("The '\(imagePaths[index].key)' image is a glyph.")
} else {
print("No glyphs found!")
}
// Prints "The 'star' image is a glyph.")
この例では、imagePaths が辞書インデックスを使用してサブスクリプト付けされていることに注意してください。キーを基礎としたサブスクリプトとは異なり、インデックスを基礎としたサブスクリプトは、対応するキー値のペアを optional ではないタプルとして返します。
print(imagePaths[glyphIndex!])
// Prints "("star", "/glyphs/star.png")"
辞書のインデックスは、追加のバッファを割り当てずに追加された値を格納するのに十分な容量が辞書にある限り、辞書に追加しても有効です。辞書がそのバッファを超えると、既存のインデックスが通知なしに無効になる場合があります。
辞書に追加する新しい値の数がわかったら、init(minimumCapacity:) イニシャライザーを使用して適切な量のバッファを割り当てます。
辞書と NSDictionary 間のブリッジ
as 演算子を使用して、Dictionary と NSDictionary 間をブリッジできます。ブリッジを可能にするには、Dictionary (辞書) の Key と Value の型がクラス、@objc プロトコル、または Foundation 型にブリッジする型でなければなりません。
Dictionary から NSDictionary へのブリッジには、常に O(1) の時間とスペースが必要です。辞書の Key と Value の型がクラスでも @objc プロトコルでもない場合、各要素の最初のアクセス時に必要な要素のブリッジが発生します。このため、辞書の内容を使用する最初の操作は O(n) を取る場合があります。
NSDictionary から Dictionary へのブリッジは、最初に辞書で copy(with:) メソッド (Objective-C の - copyWithZone:) を呼び出して immutable のコピーを取得し、O(1) の時間が必要な追加の Swift の簿記作業を実行します。すでに immutable な NSDictionary のインスタンスの場合、copy(with:) は通常、O(1) 時間で同じ辞書を返します。それ以外の場合、コピーのパフォーマンスは指定されていません。NSDictionary と Dictionary のインスタンスは、Dictionary の 2 つのインスタンスがバッファを共有するときに使用されるのと同じコピーオンライト (copy-on-write) 最適化を使用してバッファを共有します。
トピックス
辞書を作成する
辞書リテラルを使用することに加えて、これらのイニシャライザを使用して辞書を作成することもできます。
空の辞書を作成します。
少なくとも指定された数の要素に対して事前に割り当てられたスペースを持つ空の辞書を作成します。
init<S>(uniqueKeysWithValues: S)
与えられたシーケンス内のキー値のペアから新しい辞書を作成します。
init<S>(S,uniquingKeysWith: (Value, Value) -> Value)
結合するクロージャを使用して、重複した全てのキーの値を決定し、与えられたシーケンス内のキー値のペアから新しい辞書を作成します。
init<S>(grouping: S, by: (S.Element) -> Key)
キーが与えられたクロージャによって返されるグループ化であり、それらの値が各キーを返す要素の配列である新しい辞書を作成します。
辞書を調べる
辞書が空かどうかを示すブール値。
辞書内のキー値のペアの数。
新しい記憶装置を割り当てずに辞書に含めることができるキー値のペアの総数。
キーと値へのアクセス
読み取りおよび書き込みのために、与えられたキーに関連した値にアクセスします。
subscript(Key, default: () -> Value) -> Value
与えられたキーで値にアクセスします。辞書に与えられたキーが含まれていない場合、キーとデフォルト値が辞書に存在するかのように、提供されたデフォルト値にアクセスします。
func index(forKey: Key) -> Dictionary<Key, Value>.Index?
与えられたキーのインデックスを返します。
subscript(Dictionary<Key, Value>.Index) -> Dictionary<Key, Value>.Element
指定された位置にあるキー値のペアにアクセスします。
var keys: Dictionary<Key, Value>.Keys
辞書のキーだけを含むコレクション。
var values: Dictionary<Key, Value>.Values
辞書の値だけを含むコレクション。
var first: (key: Key, value: Value)?
コレクションの最初の要素。
func randomElement() -> (key: Key, value: Value)?
コレクションのランダムな要素を返します。
func randomElement<T>(using: inout T) -> (key: Key, value: Value)?
与えられた発生器を乱数のソースとして使用して、コレクションのランダム要素を返します。
キー値の追加
func updateValue(Value, forKey: Key) -> Value?
与えられたキーの辞書に格納されている値を更新するか、キーが存在しない場合は新しいキー値のペアを追加します。
func merge([Key : Value], uniquingKeysWith: (Value, Value) -> Value)
結合するクロージャを使用して重複するキーの値を決定し、与えられた辞書をこの辞書に結合します。
func merge<S>>S, uniquingKeysWith: (Value, Value) -> Value)
結合するクロージャを使用して重複するキーの値を決定し、与えられたシーケンスのキー値のペアを辞書に結合します。
func merging([Key : Value], uniquingKeysWith: (Value, Value) -> Value) -> [Key : Value]
与えられた辞書をこの辞書に結合し、結合するクロージャを使用して重複するキーの値を決定することにより、辞書を作成します。
func merging<S>(S, uniquingKeysWith: (Value, Value) -> Value) -> [Key : Value]
シーケンス内のキー値のペアを辞書に結合し、結合するクロージャを使用して重複するキーの値を決定することにより、辞書を作成します。
指定された数のキー値のペアを格納するのに十分なスペースを確保します。
キーと値の削除
func filter((Dictionary<Key, Value>.Element) -> Bool) -> [Key : Value]
与えられた predicate (述語) を満たす辞書のキー値のペアを含む新しい辞書を返します。
func removeValue(forKey: Key) -> Value?
与えられたキーとそれに関連した値を辞書から削除します。
func remove(at: Dictionary<Key, Value>.Index) -> Dictionary<Key, Value>.Element
指定されたインデックスにあるキー値のペアを削除して返します。
func removeAll(keepingCapacity: Bool)
すべてのキー値のペアを辞書から削除します。
辞書の比較
static func == ([Key : Value], [Key : Value]) -> Bool
2 つの値が等しいかどうかを示すブール値を返します。
Value が Equatable に準拠している場合に使用できます。
static func != (Dictionary<Key, Value>, Dictionary<Key, Value>) -> Bool
2 つの値が等しくないかどうかを示すブール値を返します。
キーと値の繰り返し処理
func forEach(((key: Key, value: Value)) -> Void)
for-in ループと同じ順序で、シーケンス内の各要素で与えられたクロージャを呼び出します。
func enumerated() -> EnumeratedSequence<Dictionary<Key, Value>>
ペア (n、x) のシーケンスを返します。ここで n はゼロから始まる連続した整数を表し、x はシーケンスの要素を表します。
var lazy: LazySequence<Dictionary<Key, Value>>
このシーケンスと同じ要素を含むが、map や filter などの一部の操作が遅延して実装されるシーケンス。
func makeIterator() -> Dictionary<Key, Value>.Iterator
辞書のキー値のペアの反復因子を返します。
コレクション内の要素の数以下の値。
要素の検索
func contains(where: ((key: Key, value: Value)) -> Bool) -> Bool
与えられた述語 (predicate) を満たす要素がシーケンスに含まれているかどうかを示すブール値を返します。
func allSatisfy(((key: Key, value: Value)) -> Bool) -> Bool
シーケンスのすべての要素が与えられた述語 (predicate) を満たすかどうかを示すブール値を返します。
func first(where: ((key: Key, value: Value)) -> Bool) -> (key: Key, value: Value)?
与えられた述語 (predicate) を満たすシーケンスの最初の要素を返します。
func firstIndex(where: ((key: Key, value: Value)) -> Bool) -> Index?
コレクションの要素が与えられた述語 (predicate) を満たす最初のインデックスを返します。
与えられた述語 (predicate) を要素間の比較として使用して、シーケンス内の最小要素を返します。
与えられた述語 (predicate) を要素間の比較として使用して、シーケンス内の最大要素を返します。
辞書の変換
func mapValues<T>((Value) -> T) -> Dictionary<Key, T>
与えられたクロージャによって変換された値を持つこの辞書のキーを含む新しい辞書を返します。
func reduce<Result>(Result, (Result, (key: Key, value: Value)) -> Result) -> Result
与えられたクロージャを使用してシーケンスの要素を結合した結果を返します。
func reduce<Result>(into: Result, (inout Result, (key: Key, value: Value)) -> ()) -> Result
与えられたクロージャを使用してシーケンスの要素を結合した結果を返します。
func map<T>(((key: Key, value: Value)) -> T) -> [T]
与えられたクロージャをシーケンスの要素にマッピングした結果を含む配列を返します。
このシーケンスの各要素を使用して、与えられた変換を呼び出した結果の nil でない結果を含む配列を返します。
func compactMapValues<T>((Value) -> T?) -> Dictionary<Key, T>
与えられたクロージャによる変換の結果として、nil でない値を持つキー値のペアのみを含む新しい辞書を返します。
このシーケンスの各要素で与えられた変換を呼び出した連結結果を含む配列を返します。
  廃止  
要素間の比較として与えられた述語 (predicate) を使用して並べ替えられたシーケンスの要素を返します。
func shuffled() -> [(key: Key, value: Value)]
シャッフルされたシーケンスの要素を返します。
func shuffled<T>(using: inout T) -> [(key: Key, value: Value)]
乱数のソースとして与えられた発生器を使用してシャッフルされたシーケンスの要素を返します。
コレクションの操作を実行する
辞書の順序依存操作(Order Dependent Operations on Dictionary)
Dictionary に実装されているように、すべてのコレクションに共通の順序依存の操作を実行します。
コード化と復号化
この辞書の内容を与えられたエンコーダにコード化します。
Key が Encodable に準拠し、Value が Encodable に準拠する場合利用可能です。
与えられたデコーダから復号して、新しい辞書を作成します。
Key が Decodable に準拠し、Value が Decodable に準拠している場合利用可能です。
辞書の表現
辞書の内容を表す文字列。
デバッグに適した、辞書の内容を表す文字列。
辞書を反映するミラー。
与えられたハッシャーにそれらを供給することにより、この値の必須コンポーネントをハッシュします。
Value が Hashable に準拠している場合に使用できます。
辞書をデータ値として使用
init?(from: MLDataValue.DictionaryType)
データ値の辞書から配列を作成します。
Key が MLDataValueConvertible に準拠し、Value が MLDataValueConvertible に準拠している場合利用可能です。
参照型
参照する意味または Foundation 固有の動作が必要な場合は、ブリッジされた参照型を使用します。
参照する意味を必要とする場合には Dictionary 定数の代わりに使用するための、キー値のペアの静的コレクションを表すオブジェクト。
class NSMutableDictionary
参照する意味を必要とする場合には Dictionary 変数の代わりに使用するための、キー値のペアの動的コレクションを表すオブジェクト。
サポート型
辞書のキーのビュー。
辞書の値のビュー。
辞書内のキー値のペアの位置。
Dictionary<Key、Value> のメンバーの反復因子。
型エイリアス
辞書の要素型:個々のキー値のペアを含むタプル。
typealias Dictionary.SubSequence
コレクションの要素の連続した部分範囲を表すシーケンス。
コレクションのサブスクリプト付けに有効なインデックスを昇順で表す型。
辞書間の変換と ML 型の作成
データ値にラップされた辞書から配列を作成します。
Key が MLDataValueConvertible に準拠し、Value が MLDataValueConvertible に準拠している場合に使用可能です。
データ値にラップされた辞書。
Key が MLDataValueConvertible に準拠し、Value が MLDataValueConvertible に準拠している場合に使用可能です。
static var dataValueType: MLDataValue.ValueType
辞書がデータ値に自身をラップするときに使用する基礎となる型。
Key が MLDataValueConvertible に準拠し、Value が MLDataValueConvertible に準拠している場合に使用可能です。
使用頻度の少ない機能
init(dictionaryLiteral: (Key, Value)...)
辞書リテラルで初期化された辞書を作成します。
イニシャライザ
init(_immutableCocoaDictionary: AnyObject)
ブリッジに使用される private イニシャライザ。
指定された容量で新しい辞書を作成し、与えられたクロージャを呼び出してその内容を初期化します。
インスタンスプロパティ
ハッシュ値。
Value が Hashable に準拠している場合利用可能です。
インスタンスメソッド
func index(where: ((key: Key, value: Value)) -> Bool) -> Index?
コレクションの要素が与えられた述語 (predicate) を満たす最初のインデックスを返します。
  廃止  
関連
以下に準拠
CustomDebugStringConvertible
CustomStringConvertible
CVarArg
Key が Decodable に準拠し、Value が Decodable に準拠する場合に準拠します。
Key が Encodable に準拠し、Value が Encodable に準拠する場合に準拠します。
Value が Equatable に準拠している場合準拠します。
ExpressibleByDictionaryLiteral
Value が Hashable に準拠している場合準拠します。
MLDataValueConvertible
Key が MLDataValueConvertible に準拠し、Value が MLDataValueConvertible に準拠する場合に準拠します。
以下も見よ
標準ライブラリ
符号付き整数値型。
倍精度の浮動小数点型。
文字のコレクションである Unicode 文字列値。
順序付けられた、ランダムアクセスコレクション。
複雑な問題を解決し、高性能で読みやすいコードを書きます。
トップへ
トップへ
トップへ
トップへ
トップへ