gpt4 book ai didi

swift - 在 Swift 中将 JSONEncoder 用于 Equatable 方法

转载 作者:行者123 更新时间:2023-11-28 11:43:29 24 4
gpt4 key购买 nike

我知道 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
}
}

我想解决的问题是为一种类型编写一个函数,该类型具有一个协议(protocol)的数组,具有大约 20 种不同的实现,我必须实现 == 函数而不是快速自动合成.而且我知道我可以使用选项 .sortedKeys 切换到 JSONSerialization.writeJSONObject 以保持键顺序。

与编写 == 函数的任何其他方法相比,此实现的缺点是什么?

最佳答案

答案似乎在您的问题中:“JSON 键没有任何顺序。”此外,逻辑上相等的两个事物可能编码不同(例如,如果它们的相等性仅取决于它们的 id)。此外,编码相同值的引用类型可能根本不相等(例如 UIView)。此外,这会创建一个非常广泛的 == 重载,使类型检查更加昂贵(就像 + 非常昂贵)。

您正在做的是在可以合成时尝试自动符合 Equatable。 Swift 可以做到这一点;事实上,对于大多数 Encodable 情况,只需添加 : Equatable 即可合成 Equatable。 Swift 团队在这些情况下明确选择不自动符合并强制您在需要时请求它,因为它并不总是意味着“所有属性都包含相同的位”。当 Swift 团队明确选择避免某个功能时,重新添加它很少是个好主意。

关于swift - 在 Swift 中将 JSONEncoder 用于 Equatable 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53049305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com