如何检查两个[String:Any]是否相同?

Rah*_*iya 8 swift swift3

有没有办法检查两个[String:Any]是否相同?

let actual: [[String: Any]] = [
    ["id": 12345, "name": "Rahul Katariya"],
    ["id": 12346, "name": "Aar Kay"]
]
var expected: [[String: Any]]!

if actual == expected {
    print("Equal")
}
Run Code Online (Sandbox Code Playgroud)

基本上我希望Dictionary符合Swift 3中的Equatable协议.

Dra*_*ian 15

对于Xcode 7.3,swift 2.2 字典是类型:[String:AnyObject]或简单地放NSDictionary

let actual: [String: AnyObject] = ["id": 12345, "name": "Rahul Katariya"]


var expected: [String: AnyObject] = ["id": 12346, "name": "Aar Kay"]


print(NSDictionary(dictionary: actual).isEqualToDictionary(expected))//False
Run Code Online (Sandbox Code Playgroud)

对于Xcode 8.beta 6,Swift 3

字典定义为:

struct Dictionary<Key : Hashable, Value> : Collection, ExpressibleByDictionaryLiteral
Run Code Online (Sandbox Code Playgroud)

NSDictionary具有以下便利初始化程序:

convenience init(dictionary otherDictionary: [AnyHashable : Any])
Run Code Online (Sandbox Code Playgroud)

因此,您可以将AnyHashable类型用于Key,将Any类型用于Value

let actual: [String: Any] = ["id": 12345, "name": "Rahul Katariya"]

var expected: [String: Any] = ["id": 12346, "name": "Aar Kay"]


print(NSDictionary(dictionary: actual).isEqual(to: expected))//False
Run Code Online (Sandbox Code Playgroud)

  • 您的代码甚至无法使用Swift 3进行编译•Xcode 8 beta 6 (2认同)

tou*_*per 5

使用 Swift 5.5,您可以轻松地将其转换为NSDictionary,因为它总是成功的:

XCTAssertEqual(actual as NSDictionary, expected as NSDictionary)
Run Code Online (Sandbox Code Playgroud)