【发布时间】:2017-05-19 09:13:55
【问题描述】:
我正在寻找一种持久化任意子类的好方法。
我在保存时写对象asDictionary to json,在加载时写init(json) them back。结构是Groups,具有不同类型的Units。 Group 只知道它的单位是实现 UnitProtocol 的东西。
Unit 的子类 UA 等具有与 Unit 完全相同的数据。所以数据方面,asDictionary 和init(json) 非常适合Unit。子类仅在逻辑上有所不同。因此,当从文件中恢复它们时,我相信它必须是初始化的确切子类。
我想到的(坏)解决方案
- 让每个组都知道它可以拥有不同子类的单元,不只是将它们保存为
[UnitProtocol],还可以保存为[UA],[UB]等,可以单独保存,由各自的子初始化恢复,并在初始化时合并为[UnitProtocol]。 - 用它们的类名存储子单元并创建一个
Unit.Init(json),它能够以某种方式根据子类型传递初始化。 - ??仍在思考,但我相信我必须在这里学到一些东西,以便在不违反单一责任政策的情况下以可维护的方式做到这一点。
【问题讨论】:
-
您是否有理由避免使用
NSKeyedArchiver,它会透明地处理所有这些问题?如果唯一的目标是保存和恢复对象,那么 JSON 似乎做了大量工作却无济于事。 -
原因:不知道。我该如何使用它?如果你的意思是“为什么是 json?”是因为我喜欢 json 当数据离开 iOS 并变得多云时。
-
请注意,Swift 4 将有一个更强大的解决方案。请参阅github.com/apple/swift-evolution/blob/master/proposals/…(但几个月左右将无法使用)
-
我不知道这里的“多云”是什么意思。你真的需要将它发布到需要 JSON 的服务吗? (iCloud 是一个“云”服务,完全不需要 JSON。)
标签: json swift inheritance swift-protocols