首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSONEncoder在Swift中的应用

JSONEncoder在Swift中的应用
EN

Stack Overflow用户
提问于 2018-10-29 15:55:18
回答 2查看 808关注 0票数 0

我知道JSON键没有任何顺序,可以随机生成,但是没有任何东西阻止我编写这个函数,并且在我测试的每个用例上都可以使用这个测试。

代码语言:javascript
复制
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来保持键顺序。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-29 16:18:49

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

你要做的是,当Equatable可以被合成的时候,它就会自动符合它。Swift本可以做到这一点;实际上,对于大多数Encodable情况,只需添加: Equatable就可以合成Equatable。Swift团队明确选择在这种情况下不自动遵守,并强迫您在认真时请求它,因为它并不总是意味着“所有属性都包含相同的位”。当Swift团队明确地选择避免一个特性时,重新添加它很少是一个好主意。

票数 2
EN

Stack Overflow用户

发布于 2021-02-03 20:26:23

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53049305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档