因为工作原因,学习ios开发断断续续已经有两个多月了。前阵子在学习网络编程的遗留的一个问题——有关swift反射的内容。Android开发时经常会遇到JSON格式与对象之间的转换,当然现阶段开源框架大把;也有人说“要学会偷懒”;这些也先不论了,不过说实话写框架比单纯的调UI有成就感。
闲话不多了,进入正题。这边文章涉及的知识有协议、扩展、泛型、反射,如这些你不太熟悉,那你自己看。
JSON格式:
json数据格式,简单的来理解就是一些键值对的组合;IOS开发很容易联想到字典这种数据类型。
我们先实现对象转化成JSON格式:
首先定义一个协议:
protocol JSON {
//将对象转换成字典类型
func model() -> Any?
//输出json格式字符串
func modelString() -> String?
//这个方法预留后面做自定义变量名跟JSON的键值做映射
func mapKey()
}
做一个JSON的默认实现,说明对象转化JSON的逻辑,逻辑很简单(暂时先不用理会关于变量名与JSON键值的映射,其实逻辑也很简单):
extension JSON {
func mapKey() {}
func model() -> Any? {
//使用反射遍历对象的所有属性
let mirror = Mirror(reflecting: self)
if mirror.children.count > 0 {
var keys: [String: String]? = nil
if self is JSONModel {
let json = self as! JSONModel
keys = json.keyMap
}
//对对象做字典转化
var result = [String: Any]()
for case let (label?, value) in mirror.children {
var key: String? = nil
if keys?.index(forKey: label) != nil {
key = keys?[label]
} else {
key = label
}
if let json = value as? JSON {
result[key!] = json.model()
}
}
return result
}
return self as Any
}
func modelString() -> String? {
let model = self.model()
var str: String? = nil
if JSONSerialization.isValidJSONObject(model!) {
do {
let data = try JSONSerialization.data(withJSONObject: model!)
str = String(data: data, encodi