JSON和Model最佳转换的iOS框架: MJExtension-Swift


手册简介

JSON和Model最佳转换的iOS框架: MJExtension-Swift

手册说明

1.如何导入框架

直接拖拽Reflect文件夹到您的项目中即可,无任何第三方依赖!

文件夹结构说明:

.Coding 归档相关

.Reflect 反射核心包

.Dict2Model 字典转模型

.Model2Dict 模型转字典

提示

注:框架中已为您准备了大量懒人式示例,并且简单到你直接调用类方法即可查看效果,

1.Parse-Parse8为字典转模型解析系列。

2.Convert1-Convert4为模型转字典系列。

3.Archiver1-Archiver3为归档系列。

使用方法如Studetn1.Parse(),Person1.Convert(),Book1.Action()。

2.关于MJExtension-Swift

我们可以将其理解成是MJExtension的Swift版本,它可以完成类反射、一键字典转模型、一键模型转字典、一键plist转模型以及一键归档!

MJExtension(OC): https://github.com/CoderMJLee/MJExtension 

(1)反射

直接调用对象的properties即可枚举反射您的对象

    p1.properties { (name, type, value) -> Void in        println("\(name),\(type),\(value)")    }

除了使用对象调用之外,你还可以不创建对象,直接类方法调用,此时的value无意义:

    Person.properties { (name, type, _) -> Void in        println("\(name),\(type)")    }

其中name是您的模型的属性名,type是封装的ReflectType数据类型,value是变量的值, 重度使用者请详细参考ReflectType的封装,您可以详细的知道每个属性是什么情况,如:

具体的数据类型.是否是基本数据类型.是否为数组.是否为Optional.是否为OC过来的对象.是否为自定义的Class类

var typeName: String!/**  系统解析出的Type  */var typeClass: Any.Type!var disposition: MirrorDisposition!var dispositionDesc: String!/**  是否是可选类型  */var isOptional: Bool = false/**  是否是数组  */var isArray: Bool = false/**  真实类型: 可选 + 数组  */var realType: RealType = .None

,除了上面介绍的功能之外,还加入了仿OC打印: 你可以直接打印您的对象,比如打印Book1对象(BOOK1类位于项目中的Archiver1.swift中):

println(book1)

控制台会这样输出:

Reflect.Book1 <0x7a09fb10>: {name: tvbprice: 36.6}

附加功能之解析过程的字段映射与字段忽略,子类只需重写此方法即可:

/**  字段映射  *///使用模型的userModel属性去解析并接受字典中的user_model键值对func mappingDict() -> [String: String]? {    return ["userModel":"user_model"]}  /**  字段忽略  *///忽略并且不解析模型的info属性func ignorePropertiesForParse() -> [String]? {    return ["info"]}

您还可以使用以下方法完成字符串向类的转变:

let cls = ClassFromString("Reflect.Person")

不过请注意,这里的字符串是含有命名空间的。

(2)一键字典转模型

字典转模型非常简单,已做各种级联,这里不再赘述细节了:

let stu1 = Student1.parse(dict: Student1Dict)let stus = Student7.parses(arr: Student7DictArr)

如果你属性为Bool,你可能会遇到UndefinedKey,这是因为swift自身的原因,你只需实现以下方法手动解析:

override func setValue(value: AnyObject?, forUndefinedKey key: String) {    self.isVip = (value as! Int) != 0}

解析Plist文件,请不要带后缀:

let author = Author.parsePlist("Author")

(3)一键模型转字典

模型转字典也非常简单,已做各种级联,这里不再赘述细节了:

let dict = person3.toDict()

(4)一键归档

归档已做了级联,使用同样简单,同时封装了Caches文件夹的操作,直接保存在Caches文件夹中

归档:单个模型归档name可为空,数组时name值不可为空,返回归档位置

let path1 =  Book2.save(obj: book2, name: nil)let path2 =  Book3.save(obj: bookArr, name: "book3")

读取:请使用同样的key,如保存没有使用name为nil,读取同样使用nil

let arcBook2 = Book2.read(name: nil)let arr = Book3.read(name: "book3")

删除数据:

Book1.delete(name: nil)

附加功能:归档字段忽略

/**  归档字段忽略  *///不归档模型中的icon字段func ignoreCodingPropertiesForCoding() -> [String]? {    return ["icon"]}

3.解释下对该框架存在的某些疑问。

 (1)这个框架并不是对MJExtension的纯Swift翻译

,虽然MJExtension-Swift与MJExtension有着相差无异的功能,但是它们两个的底层差别甚多。可能大家觉得在反射这方面它们体现出的功能效果是一样的,但其实它们的基本代码并无相同之处。不过对于一键互转字典-模型来说,它们都是基于反射功能上实现的。 

 (2)虽然OC中的Runtime在Swift中经测试发现可用,但在Swift中更多的是叫Reflect反射,所以Runtime在Swift中并不是很好用。 

 (3)值得注意的是Swift有全名空间,所以是不需要前缀的,但是将框架命名为CFRuntime是因为没有把使用OC的习惯改正过来,而OC的Runtime特性个人比较喜欢,就用了Runtime,而非Swift中的Reflect

 (4)它并不支持Swfit中的结构体噢,两点原因: 结构体主要用于数据结构,是值类型,大型数据使用引用类型的类更好。 从继承的角度来说,继承自NSObject,就已经说明问题。

4.结语 

   写出这套框架是由于个人对于MJExtension太过依赖,但是公司的项目已经全部Swift化,所以只好抓紧时间在参考大量资料和综合了MJExtension理念的情况下写出来,该框架的API与MJExtension保持高度一致,如果你会使用MJExtension,那么上手CFRuntime基本没多大问题。

更新记录

在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号