Swift 字典转模型 KVC
2017-11-01 本文已影响34人
EvanJq
在iOS开发中,需要对后台请求回来的数据进行处理解析成模型使用。这时就需要对数据(json/字典)转模型处理.
这里介绍不使用第三方框架,使用原生KVC方法。
定义BaseModel
import UIKit
@objcMembers // 标记为OC属性,Swift4.0后为了与OC的API区分,需要添加,不然键值配对无效
class BaseModel: NSObject {
convenience init(keyedValues: [String: Any]) {
self.init()
// 字典自动匹配属性名赋值
self.setValuesForKeys(keyedValues)
}
override init() {
super.init()
}
// 不定义遇到未定义字段会报错
override func setValue(_ value: Any?, forUndefinedKey key: String) {
// 处理字典中未定义字段,这里直接不处理解析
}
// 键值配对方法,子类可以重写该方法对特殊字段自定义处理
override func setValue(_ value: Any?, forKey key: String) {
super.setValue(value, forKey: key)
}
}
模型定义时只需继承BaseModel:
class Man: BaseModel {
var manId: String = ""
var name: String = ""
var age: Int = 0
override func setValue(_ value: Any?, forKey key: String) {
// 处理字段不统一属性
if key == "id", let id = value as? String {
manId = id
} else {
super.setValue(value, forKey: key)
}
}
}
let dict: [String: Any] = ["id": "20170101", "name": "小明", "age": 18]
let man = Man(keyedValues: dict)
print("id: \(man.manId) name: \(man.name) age: \(man.age)")
优点
- 使用简单,上手快。
- 原生API集成,轻量,耦合低。
缺点
- 无法自动处理嵌套属性,需要手动处理。
- 对后端返回格式依赖性较大,对字段与类型的统一要求高。适合后端格式标准稳定性小项目。
- 需要手动解析路径。