把JSON对象当作一级Swift对象而不是仅仅把它们当作字典有什么好处?[closed]

xkftehaa  于 2022-12-27  发布在  Swift
关注(0)|答案(1)|浏览(79)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

昨天关门了。
Improve this question
我从一个服务中获得了一个很大的JSON文档,它具有包含大量信息的深度嵌套层次结构(通常为5 MB-10 MB),我已经在服务后端定义了编码在这个JSON文档中的类和结构。
在Swift中重新定义所有这些结构,使它们成为Codable/Encodable,以便与JSONSerializer一起使用,有什么好处?
换句话说,将JSON结构中的对象视为一级Swift类而不是将整个JSON文档视为字典有什么好处?

63lcw9qa

63lcw9qa1#

Swift作为一种强类型语言,在其类型系统中提供了许多工具,使开发更安全、更容易, -通过使用成熟的Swift类型,您可以利用这些工具来改善开发体验,并使代码更有性能:

  • 字典是一种非类型化的通用数据结构。这意味着:

1.编译器无法防止您在写出键名时出现拼写错误,而引用不存在的类型上的属性的代码将不会编译
1.编译器无法像为已知类型的属性那样为字典自动完成键名
1.访问字典内的值需要 * 查找 * 该值,这导致性能成本;但是,对于已定义类型上的属性,编译器可以生成直接访问这些属性的代码

  • 访问[String: Any]内的值会生成未知类型的Optional值:
  • 如果您知道该值是“假定”存在的,那么Optional就会增加心理和性能方面的开销
  • 如果您知道该值应该是什么类型,则将其强制转换为您期望的类型也很容易出错,并且还会带来一些心理和性能开销
  • 使用字典作为数据的主要数据存储意味着 * 每次 * 访问都会导致所有这些缺点
  • JSONDecoder(或类似的)与定义良好的类型一起使用,可以让您在一个能够处理故障或无效数据的本地化位置 * 提前 * 验证传入数据,它可以让您Assert单个值是您所期望的正确类型(并且它们没有丢失),而且整个数据在语义上是有意义的;如果不执行此验证,您可能会将无效数据沿着到应用程序的其他部分(与上述所有情况结合起来,这意味着很容易意外地错误访问数据),或者发现数据在其他地方无效,但无法从该位置处理故障,从而导致非常常见的错误
  • 此传递也只会预先发生一次,这意味着进一步访问数据不会产生性能成本

总之,除了非常琐碎的用例之外,强烈建议使用成熟的类型,而不是将无类型化的数据留在字典中。

相关问题