文書   >   Swift   >   Dictionary


汎用構造体


Dictionary


その要素がキー値のペアであるコレクション。





宣言


@frozen struct Dictionary<Key, Value> where Key : Hashable


概要


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 演算子を使用して、DictionaryNSDictionary 間をブリッジできます。ブリッジを可能にするには、Dictionary (辞書) の KeyValue の型がクラス、@objc プロトコル、または Foundation 型にブリッジする型でなければなりません。


Dictionary から NSDictionary へのブリッジには、常に O(1) の時間とスペースが必要です。辞書の KeyValue の型がクラスでも @objc プロトコルでもない場合、各要素の最初のアクセス時に必要な要素のブリッジが発生します。このため、辞書の内容を使用する最初の操作は O(n) を取る場合があります。


NSDictionary から Dictionary へのブリッジは、最初に辞書で copy(with:) メソッド (Objective-C の - copyWithZone:) を呼び出して immutable のコピーを取得し、O(1) の時間が必要な追加の Swift の簿記作業を実行します。すでに immutable な NSDictionary のインスタンスの場合、copy(with:) は通常、O(1) 時間で同じ辞書を返します。それ以外の場合、コピーのパフォーマンスは指定されていません。NSDictionaryDictionary のインスタンスは、Dictionary の 2 つのインスタンスがバッファを共有するときに使用されるのと同じコピーオンライト (copy-on-write) 最適化を使用してバッファを共有します。


トピックス





辞書を作成する





辞書を調べる





キーと値へのアクセス





キー値の追加





キーと値の削除





辞書の比較





キーと値の繰り返し処理





要素の検索





辞書の変換





コレクションの操作を実行する





コード化と復号化





辞書の表現





辞書をデータ値として使用





参照型





サポート型





型エイリアス





辞書間の変換と ML 型の作成





使用頻度の少ない機能





イニシャライザ





インスタンスプロパティ


var hashValue: Int


ハッシュ値。
ValueHashable に準拠している場合利用可能です。





インスタンスメソッド


関連




以下に準拠


以下も見よ





標準ライブラリ

















トップへ












トップへ












トップへ












トップへ












トップへ
目次
Xcode 11 の新機能

  • 言語:Swift
  • SDK

    Xcode 6.0.1+


    Framework

    Swift 標準ライブラリ


  • 宣言
  • 概要
  • トピックス
  • 関連
  • 以下も見よ












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












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












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












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












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












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