想要将 App 中的 model 存入 Realm,那这个 model 则必须继承自 Realm 的 Object 类。而 Object 的对存储的属性类型具有一定的约束:
类型 | 非空值形式 | 可空值形式 |
---|---|---|
Bool | @objc dynamic var value = false |
let value = RealmOptional<Bool>() |
Int | @objc dynamic var value = 0 |
let value = RealmOptional<Int>() |
Float | @objc dynamic var value: Float = 0.0 |
let value = RealmOptional<Float>() |
Double | @objc dynamic var value: Double = 0.0 |
let value = RealmOptional<Double>() |
String | @objc dynamic var value = "" |
@objc dynamic var value: String? = nil |
Data | @objc dynamic var value = Data() |
@objc dynamic var value: Data? = nil |
Date | @objc dynamic var value = Date() |
@objc dynamic var value: Date? = nil |
Object | 不存在:必须是可空值 | @objc dynamic var value: Class? |
List | let value = List<Type>() |
let value = List<Type>() |
LinkingObjects | let value = LinkingObjects(fromType: Class.self, property: "property") |
不存在:必须是非可空值 |
从上表可以看到,Bool、Int、Float、Double 的可选类型都不再是以前的 Type?
形式了,而是采用了 RealmOptional<Type>
的形式。数组也不再是 [Type]
的形式而是使用Realm定义的 List
。如此一来,这个 model 就对于 Codable
就十分不友好了。
要想将此 model 用于 JSON 解析就有点不方便了,但依然手办法。以 Book
这个 Model 为例, 假设它有如下几个属性,publishYear
, name
, isFinished
。(publishYear,isFinished 为可选类型)
1 | Members |
遵从 Decodable
协议,并实现 init(from decoder: Decoder)
1 | Members |
测试一下:
1 |
|
输出:
1 | [Book { |
到这里就已经完成了 Object 用来解析 JSON 的工作。但依然有缺陷,就是用起来太麻烦。需要为每一个 继承自 Object 的 model 都手动进行解析。能不能再简化呢?答案是肯定的。 让 RealmOptional
和 List
实现 Codable 协议。
1 | // swiftlint:disable line_length identifier_name |
上述代码来自这里, 稍经修改。