手册简介
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基本没多大问题。
更新记录
多端阅读
-
在PC/MAC上查看《JSON和Model最佳转换的iOS框架: MJExtension-Swift》下载《JSON和Model最佳转换的iOS框架: MJExtension-Swift》离线版客户端,进入客户端后通过搜索当前教程手册的名称并下载,就可查看当前离线教程文档。
-
在移动端查看《JSON和Model最佳转换的iOS框架: MJExtension-Swift》https://m.w3cschool.cn/mjextension_swift_ops/直接访问
-
在手机APP上查看《JSON和Model最佳转换的iOS框架: MJExtension-Swift》下载w3cschool手机App端,请从各大安卓应用商店、苹果App Store搜索并下载w3cschool手机客户端,在App中搜索当前教程手册的名称查看。