Swiftで2つの辞書を比較する方法は?
質問
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
関連
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] JavaScriptで2つの日付を比較する
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] 既存のUIKitアプリケーションにSwiftUIビューを含める
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Swiftで複数のカスタムセルを持つUITableview
-
[解決済み] 非'@objc'メソッドは'@objc'プロトコルのオプション要件を満たしていない
-
[解決済み] ""内の二重引用符を印刷するには?
-
[解決済み] Swift - 複数条件でオブジェクトの配列を並べ替える
-
[解決済み] SHA256 in swift
-
[解決済み] SwiftUIのDSLを可能にするものは何ですか?
-
[解決済み] XcodeでFirebase Analyticsをオンにする
-
[解決済み] swift 3.0 Data to String?
-
[解決済み] Swiftのインライン条件?
-
[解決済み] SwiftUIでリストの左右のパディングを削除する方法は?