我知道JSON键没有任何顺序,可以随机生成,但是没有任何东西阻止我编写这个函数,并且在我测试的每个用例上都可以使用这个测试。
func ==<T: Encodable> (lhs: T, rhs: T) -> Bool {
let encoder = JSONEncoder()
do {
let leftEncoded = try encoder.encode(lhs)
let rightEncoded = try encoder.encode(rhs)
return leftEncoded == rightEncoded
} catch {
return false
}
}我想要解决的问题是为一种类型编写一个函数,它有一个由20个不同实现的协议组成的数组,我必须实现==函数,而不是快速自动合成。我知道我可以用选项.sortedKeys切换到.sortedKeys来保持键顺序。
与任何其他编写==函数的方法相比,这个实现的缺点是什么?
发布于 2018-10-29 16:18:49
答案似乎在您的问题中:"JSON键没有任何顺序。“此外,逻辑上相等的两件事情可能编码不同(例如,如果它们的相等性仅依赖于它们的id )。此外,编码相同值的引用类型可能根本不相等(例如,UIView)。而且,这会造成一个非常广泛的==重载,使得类型检查更加昂贵(就像+非常昂贵)。
你要做的是,当Equatable可以被合成的时候,它就会自动符合它。Swift本可以做到这一点;实际上,对于大多数Encodable情况,只需添加: Equatable就可以合成Equatable。Swift团队明确选择在这种情况下不自动遵守,并强迫您在认真时请求它,因为它并不总是意味着“所有属性都包含相同的位”。当Swift团队明确地选择避免一个特性时,重新添加它很少是一个好主意。
发布于 2021-02-03 20:26:23
func ==<T: Codable> (lhs: T, rhs: T) -> Bool {
let encoder = JSONEncoder()
guard let lhsData = try? encoder.encode(lhs),
let rhsData = try? encoder.encode(lhs),
let left = try? JSONSerialization.jsonObject(with: lhsData) as? [String : Any],
let right = try? JSONSerialization.jsonObject(with: rhsData) as? [String : Any] else { return false }
let leftDictionary = left as NSDictionary
let rightDictionary = right
return leftDictionary.isEqual(to: rightDictionary)
}https://stackoverflow.com/questions/53049305
复制相似问题