项目中最近需要将一个复杂的对象转成JSON,于是就利用Mirror写了一个模型转字典的通用方法,应该可以满足大部分使用场景下的需求了
函数实现:
func convertToDictNesting(obj: Any, remainFeild: [String]? = nil, replace: (((label: String, value: Any)) -> (String, Any))? = nil) -> [String: Any] {
var dict: [String: Any] = [:]
var children: [Mirror.Child] = []
if let superChildren = Mirror(reflecting: obj).superclassMirror?.children {
children.append(contentsOf: superChildren)
}
children.append(contentsOf: Mirror(reflecting: obj).children)
for child in children {
if let key = child.label {
if let remainFeild = remainFeild, !remainFeild.contains(key) {
continue
}
let subMirror = Mirror(reflecting: child.value)
if let displayStyle = subMirror.displayStyle, displayStyle == .optional {
if subMirror.children.isEmpty {
continue
}
}
//解析类型属性
let subDict = convertToDictNesting(obj: child.value, remainFeild: remainFeild, replace: replace)
if subDict.isEmpty {
if let replaceReturn = replace?((key, child.value)) {
if !replaceReturn.0.isEmpty {
if let aryValue = replaceReturn.1 as? [Any] {
var dictAry: [Any] = []
for value in aryValue {
let subDict = convertToDictNesting(obj: value, remainFeild: remainFeild, replace: replace)
if subDict.isEmpty {
dictAr