1. ホーム
  2. swift

Swiftで2つの辞書を比較する方法は?

2023-10-19 15:14:21

質問

2つの [String: AnyObject] 辞書を比較する簡単な方法はありますか? == 演算子を受け付けないので?

2つの辞書を比較するということは、正確には同じキーを持ち、すべてのキーについて同じ値を持っているかどうかをチェックするということです。

どのように解決するのですか?

Hot Licks が既に述べているように、NSDictionary メソッドを使用することができます。 isEqualToDictionary () を使って、以下のように等しいかどうかを確認することができます。

let dic1: [String: AnyObject] = ["key1": 100, "key2": 200]
let dic2: [String: AnyObject] = ["key1": 100, "key2": 200]
let dic3: [String: AnyObject] = ["key1": 100, "key2": 250]

println( NSDictionary(dictionary: dic1).isEqualToDictionary(dic2) )   // true
println( NSDictionary(dictionary: dic1).isEqualToDictionary(dic3) )  // false

また、以下のようにカスタム演算子 "==" を実装することもできます。

public func ==(lhs: [String: AnyObject], rhs: [String: AnyObject] ) -> Bool {
    return NSDictionary(dictionary: lhs).isEqualToDictionary(rhs)
}

println(dic1 == dic2)   // true
println(dic1 == dic3)   // false


Xcode 9 - Swift 4

docsから、dictionaryはstructとして定義されるようになりました。

struct Dictionary<Key : Hashable, Value> : Collection, ExpressibleByDictionaryLiteral

説明

キーと値のペアを要素とするコレクション。A 辞書はハッシュテーブルの一種であり、含まれるエントリへの高速アクセスを提供します。 への高速アクセスを提供します。テーブル内の各エントリーは、その このキーは、文字列や数値などのハッシュ可能な型です。このキーを使って このキーは文字列や数値などのハッシュ化可能な型であり、そのキーを使って対応する値を取得します。他の言語では 他の言語では、同様のデータ型はハッシュまたは関連する配列として知られています。 配列として知られています。辞書リテラルを使用して、新しい辞書を作成します。A 辞書リテラルは、キーと値のペアをカンマで区切ったリストで、各キーはコロンで区切られています。 各キーはコロンで区切られ、関連する値は角括弧で囲まれています。 を角括弧で囲んだものです。ディクショナリ リテラルを変数 または定数に割り当てるか、辞書を必要とする関数に渡します。

HTTPレスポンスコードとそれに関連するメッセージの辞書を作成する方法を紹介します。

var responseMessages = [200: "OK",
                        403: "Access forbidden",
                        404: "File not found",
                        500: "Internal server error"]

responseMessages変数の型は以下のように推測されます。 [Int: String] . 辞書のキータイプは Int であり、辞書の値の型は 辞書の値の型は String .

キーと値のペアがない辞書を作成するには、空の辞書リテラル([:])を使用します。

var emptyDict: [String: String] = [:]

Hashable プロトコルに準拠した任意の型は、Swift のすべての基本型を含む、辞書のキー型として使用できます。Hashable プロトコルに準拠させることで、独自のカスタムタイプを辞書のキーとして使用することができます。


もうカスタム演算子を定義する必要はありません。

docsより。

static func ==(lhs: [Key : Value], rhs: [Key : Value]) -> Bool


テスト中です。

let dic1 = ["key1": 100, "key2": 200]
let dic2 = ["key1": 100, "key2": 200]
let dic3 = ["key1": 100, "key2": 250]

print(dic1 == dic2)   // true
print(dic1 == dic3)   // false

上の例では、すべての辞書のキーと値は同じ型です。 もし、型が [String: Any] Xcode は、二項演算子 == は、2つの [String: Any] オペランドに適用することはできません。

let dic4: [String: Any] = ["key1": 100, "key2": "200"]
let dic5: [String: Any] = ["key1": 100, "key2": "200"]
let dic6: [String: Any] = ["key1": 100, "key2": Date()]

print(dic4 == dic5)  // Binary operator == cannot be applied to two `[String: Any]` operands

を拡張することができます。 == 演算子の機能を拡張し、Swift Dictionary を NSDictionary にキャストし、辞書の値を Hashable プロトコルに制約をかけることができます。


Xcode 11 - Swift 5.1

public func ==<K, L: Hashable, R: Hashable>(lhs: [K: L], rhs: [K: R] ) -> Bool {
   (lhs as NSDictionary).isEqual(to: rhs)
}


テスト中です。

let dic4: [String: AnyHashable] = ["key1": 100, "key2": "200"]
let dic5: [String: AnyHashable] = ["key1": 100, "key2": "200"]
let dic6: [String: AnyHashable] = ["key1": 100, "key2": Date()]


print(dic4 == dic5)   // true
print(dic4 == dic6)   // false


let dic7: [String: String] = [ "key2": "200"]
let dic8: [String: Date] = [ "key2": Date()]
print(dic7 == dic8)   // false