在Swift中使用XCTAssertEquals比较两个字典

11
我正在做exercism.io编程练习,我的代码需要执行的测试目标是将两个字典进行比较。该练习的源代码可以在此处找到:https://github.com/exercism/xswift/tree/master/word-count 根据我的理解,bridgeToObjectiveC是苹果公司用于执行某些操作的内部方法,因此已被删除。如果已经删除,那么我会得到“'[S:T]'没有名为'bridgeToObjectiveC'的成员”的错误提示,这很容易理解。
如果不使用该方法,仅使用AssertEquals调用中的参数,则会得到“'[S:T]'不符合协议'Equatable'”的错误提示。在Swift中,两个字典是否可比较?如何使它们可比较?

请将代码示例作为文本包含在内。它们应该是预格式化的文本。 - Peter DeWeese
4个回答

10
只要值是可比较的,您就可以检查字典的相等性。修改XCTAssertEqualDictionaries以包含通用约束:
func XCTAssertEqualDictionaries<S, T: Equatable>(first: [S:T], _ second: [S:T]) {
    XCTAssert(first == second)
}

谢谢,这是一种非常方便的方法。 - Johan

7

尝试

XCTAssertEqual(swiftDict as NSObject, objCDict as NSObject)

强制编译器放松,同时调用isEqual:方法。


3

不,Swift字典是不能直接比较的。为了进行单元测试,你可以手动比较它们的大小和逐对元素比较,或者你可以简单地将它们转换成NSDictionary,然后以这种方式进行比较。


0

如果存在混合类型的字典,您可以逐个比较每个键,前提是您事先知道这些键和它们的类型。然而,这并不能推广到通用的比较函数。

let dict1: [String: Any] = ["a": "a", "b": 2]
let dict2: [String: Any] = ["a": "a", "b": 2]
XCTAssertEqual(dict1["a"] as? String, dict2["a"] as? String)
XCTAssertEqual(dict1["b"] as? Int, dict2["b"] as? Int)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接