BambooHero

iOSアプリ開発と株式投資をメインに色々書きます

Swiftで[String: Any]型の等価性チェックをする

Swiftで以下のコードはコンパイルエラーになります。
Any型がEquatableに準拠していないというのが理由です。

let dict1: [String: Any] = ["foo": "bar"]
let dict2: [String: Any] = ["foo": "bar"]
print(dict1 == dict2)  // Protocol 'Any' as a type cannot conform to 'Equatable'


そこで、以下のように[String: Any]をNSDictionaryにキャストして比較します。
こうするとコンパイルすることができ、結果はtrueになります。

let dict1: [String: Any] = ["foo": "bar"]
let dict2: [String: Any] = ["foo": "bar"]
print(dict1 as NSDictionary == dict2 as NSDictionary)  // true


SwiftではDictionaryとNSDictionaryをシームレスに相互変換することができます。

そして、NSDictionaryはNSObjectのサブクラスであるため、Equatableに準拠しています。

これによって上記の比較が可能になります。


参考

github.com