将字典转换为自定义类型

时间:2017-07-03 13:13:18

标签: swift dictionary deserialization

我使用Mirror将所有自定义类转换为字典,以便用类似plist的结构保存它们。使用Mirrors,我只需按名称存储每个值,因此具有变量“title”的类将变为带有键“title”及其在字典中的值的字典。

问题是,如何扭转这种局面?我在每个字典中存储一个“类型”信息,所以我知道字典应该转换成哪种类型,但我不知道如何进行转换。我曾经在Objective-C中使用setValue: forKey:但是当我搬到Swift时,我有许多不再适用的结构。

我能想到的唯一解决方案是让所有自定义类型都符合描述init(dictionary: [String: Any])函数的协议,然后手动将字典翻译成那里的类型。在我的常规转换器函数中,然后我获取类型并通过switch语句简单地调用正确类型的init。但是,手动编写

似乎非常愚蠢
title = dictionary["title"]

我在整个应用程序中拥有数千个属性。有更简单的方法吗?

2 个答案:

答案 0 :(得分:0)

我认为你提出的选择是好的。我建议使用可选的init,如init?(dictionary: [String: Any]),如果您要这样做,那么您可以确保某些键值对可用,如果您的最终对象不完整则返回nil。

然而,听起来你肯定可以从MantleObjectMapper这样的东西中受益,它们都能很好地处理序列化。

答案 1 :(得分:0)

根据tbogosia的评论,我看了一下Swift 4提供的内容,看起来新的Codable是可行的。

Apple doc就在这里:

  

https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

对于较低版本的Swift,似乎没有其他选择,只能为每个自定义类型使用自定义init函数。