本文字数:3380字
预计阅读时间:10分钟
概述
简单介绍一下,Realm数据库:
Realm 是一个跨平台的移动数据库引擎,于 2014 年 7 月发布,准确来说,它是专门为移动应用所设计的数据持久化解决方案之一。优点主体现在:1.跨平台 2.简单易用,并且相对于iOS中使用的SQLite 以及 Core Data 要快很多 3.可视化
在项目中由于使用到了 Realm数据库,就避免不了创建Realm数据库特有的数据库模型:基本类型为Realm.Object
的模型。之后下文都将使用Realm.Object
代表realm数据模型。
由于Realm.Object
的特殊性,它不可跨线程使用,特有的list等基础类型,以及为了与业务关系解耦等原因,业务中不直接使用Realm.Object
。所以我们给每个Realm.Object
模型,创建了一个对应的业务模型下文简称为模型
如图1,我们需要在两种对应模型之间进行转换。为了减少重复的代码,就需要写一个模型转换功能。
想到要写一个模型转换功能?我们应该能想到有很多 Dictionary
或者Array
与模型
互转的框架,这些是开发中很常见的功能。这里不在赘述他们的原理,毕竟OC,swift中的转换思路和现有库,想必各位读者应该都看过或者写过不少。
简单描述一下已有框架的使用流程,如果从A类模型
转换成B类模型
。利用这些框架,我们想到的应该是 A类模型
先转换成Dictionary
或者json,然后Dictionary
或者json转换成B类模型
,使用已有框架基本都是这种套路。
本文章要阐述的不是如何使用这些框架,也不是单纯讲转换原理,而是采用更加swift的方式来实现转换功能。至于为什么要"多此一举"自己写转换具体有如下原因。
swift转换框架大部分都是使用的OC原有Api思路来转换,换汤不换药,虽然还是有一个比较特殊的直接获取指针赋值的,但是在当时(大概两年前)又不够稳定
我们有
Realm.Object
这种类型的模型,它有自定义的基本类型,目前已有框架是没法直接使用来进行转换的。不过他提供了Dictionary
生成Realm.Object
的方法(这个方法还有待改进),可惜他没有提供Realm.Object
生成Dictionary
的方法上面我提过了已有套路实现转换要分两步,能不能有方式可以直接
Realm.Object
与模型
互转?实现转换的方式过程中少用或者尽量不用OC的原有运行时,符号类型判断,对象动态创建等,尽量使用swift官方标配protocol来做这件事
上面的原因条件都说了,那就开始准备咯。既然自己造轮子,那当然得造出适合自己的轮子。在这转换的实现过程中swift协议起到了不可或缺的作用,希望现在分享出来也不算太晚。正文开始咯~
转换之前的准备
概述中已经介绍了写这转换功能的初衷,我们要做的Realm.Object
与普通业务模型
转换。在此先列下写这转换时的想法:
你要对
Realm.Object
有足够的了解,充分利用Realm.Object
的已有特性转换方式尽量使用swift特性
能不能直接由普通类型
模型
转换成Realm.Object
,减少中间的Dictionary
步骤?
要实现这个转换主要涉及到的具体问题
swift 类或结构体
Any.Type
创建对象(包括NSObject
,Option,Array,Dictionary
等泛型类型)Realm
List<T>
类型与[T]
类型通用转换RealmObject类型属性遍历(需要翻看realm源码,因为官方文档其实也没有提及,我也不带大家看源码了,有兴趣可以私我分享realm,哈哈哈)以及NSObject类型属性遍历方式
从基础代码开始
首先为了功能,我们定义协议,并写好转换方法名称。这样业务模型
(需继承NSObject,实际赋值那步需要使用KVC)遵循Persistable
协议后,就可以使用了
protocol Persistable {
associatedtype ManagedObject: RealmSwift.Object
//业务模型转RealmObject方法
public func manag