我使用Mirror将所有自定义类转换为字典,以便用类似plist的结构保存它们。使用Mirrors,我只需按名称存储每个值,因此具有变量“title”的类将变为带有键“title”及其在字典中的值的字典。
问题是,如何扭转这种局面?我在每个字典中存储一个“类型”信息,所以我知道字典应该转换成哪种类型,但我不知道如何进行转换。我曾经在Objective-C中使用setValue: forKey:
但是当我搬到Swift时,我有许多不再适用的结构。
我能想到的唯一解决方案是让所有自定义类型都符合描述init(dictionary: [String: Any])
函数的协议,然后手动将字典翻译成那里的类型。在我的常规转换器函数中,然后我获取类型并通过switch语句简单地调用正确类型的init。但是,手动编写
title = dictionary["title"]
我在整个应用程序中拥有数千个属性。有更简单的方法吗?
答案 0 :(得分:0)
我认为你提出的选择是好的。我建议使用可选的init,如init?(dictionary: [String: Any])
,如果您要这样做,那么您可以确保某些键值对可用,如果您的最终对象不完整则返回nil。
然而,听起来你肯定可以从Mantle或ObjectMapper这样的东西中受益,它们都能很好地处理序列化。
答案 1 :(得分:0)
根据tbogosia的评论,我看了一下Swift 4提供的内容,看起来新的Codable
是可行的。
Apple doc就在这里:
对于较低版本的Swift,似乎没有其他选择,只能为每个自定义类型使用自定义init
函数。