相關(guān)鏈接
https://github.com/kakaopensource/KakaJSON
https://github.com/ibireme/YYModel
https://www.cnblogs.com/mjios/p/11352776.html
1、為什么要混合使用
因?yàn)楫?dāng)swift的model如果嵌套使用OC的model時(shí),使用KakaJson無法解析OC的model
2、調(diào)研
監(jiān)聽
復(fù)制代碼Swift
// 有時(shí)候可能想在JSON轉(zhuǎn)模型之前、之后做一些額外的操作
// KakaJSON會(huì)在JSON轉(zhuǎn)模型之前調(diào)用模型的kj_willConvertToModel方法
// KakaJSON會(huì)在JSON轉(zhuǎn)模型之后調(diào)用模型的kj_didConvertToModel方法
struct Car: Convertible {
var name: String = ""
var age: Int = 0
mutating func kj_willConvertToModel(from json: [String: Any]) {
print("Car - kj_willConvertToModel")
}
mutating func kj_didConvertToModel(from json: [String: Any]) {
print("Car - kj_didConvertToModel")
}
}
let name = "Benz"
let age = 100
let car = ["name": name, "age": age].kj.model(Car.self)
// Car - kj_willConvertToModel
// Car - kj_didConvertToModel
XCTAssert(car.name == name)
XCTAssert(car.age == age)
/*************************************************************/
// 同樣也支持類
class Person: Convertible {
var name: String = ""
var age: Int = 0
required init() {}
func kj_willConvertToModel(from json: [String: Any]) {
print("Person - kj_willConvertToModel")
}
func kj_didConvertToModel(from json: [String: Any]) {
print("Person - kj_didConvertToModel")
}
}
class Student: Person {
var score: Int = 0
override func kj_willConvertToModel(from json: [String: Any]) {
// 如果有必要的話,可以調(diào)用super的實(shí)現(xiàn)
super.kj_willConvertToModel(from: json)
print("Student - kj_willConvertToModel")
}
override func kj_didConvertToModel(from json: [String: Any]) {
// 如果有必要的話,可以調(diào)用super的實(shí)現(xiàn)
super.kj_didConvertToModel(from: json)
print("Student - kj_didConvertToModel")
}
}
let name = "jack"
let age = 10
let score = 100
let student = ["name": name, "age": age, "score": score].kj.model(Student.self)
// Person - kj_willConvertToModel
// Student - kj_willConvertToModel
// Person - kj_didConvertToModel
// Student - kj_didConvertToModel
XCTAssert(student.name == name)
XCTAssert(student.age == age)
XCTAssert(student.score == score)
3、如何混合使用
故可以使用kj_willConvertToModel來操作混合預(yù)處理混合model解析
/// swift model類中嵌套OC的類數(shù)據(jù)解析
/// - Parameter json: 原始json
func kj_willConvertToModel(from json: [String: Any]) {
if let dic = json["dicKey"] as? [AnyHashable : Any] {
self.feeds = OCModel.yy_model(with: dic)
}
}
4、舉一反三
YYModel可以替換為手動(dòng)解析以及MJExtension,and so on