Swift - 使用ObjectMapper实现模型转换2(StaticMappable协议)
作者:hangge | 2017-05-19 08:10
相关文章系列:
Swift - 使用ObjectMapper实现模型转换1(JSON与Model的相互转换)
[当前文章] Swift - 使用ObjectMapper实现模型转换2(StaticMappable协议)
Swift - 使用ObjectMapper实现模型转换3(高级用法)
Swift - 使用ObjectMapper实现模型转换4(与Alamofire结合使用)
Swift - 使用ObjectMapper实现模型转换1(JSON与Model的相互转换)
[当前文章] Swift - 使用ObjectMapper实现模型转换2(StaticMappable协议)
Swift - 使用ObjectMapper实现模型转换3(高级用法)
Swift - 使用ObjectMapper实现模型转换4(与Alamofire结合使用)
在前面的文章中我们使用的都是 ObjectMapper 的 Mappable 协议,本文接着介绍另一个协议:StaticMappable
1,StaticMappable协议介绍
(1)同 Mappable 协议一样,StaticMappable 也 BaseMappable 的子协议。(2)ObjectMapper 通过该协议如下方法获取相应的映射对象(这个对象当然也要符合 BaseMappable 协议)。同时,我们也可以在使用这个方法在对象序列化之前验证 JSON。
class func objectForMapping(map: Map) -> BaseMappable?
2,使用样例
(1) 这里我定义了 3 个模型类。- 基类 Vehicle 实现 StaticMappable 协议,而 Car 和 Bus 是 Vehicle 的两个子类。
- Vehicle 中有个 type 属性,用来表示汽车类型。objectForMapping 方法便是根据该属性获取相应的映射对象。
- Car 和 Bus 又有自己单独的属性,分别是:name 和 fee。
//交通工具
class Vehicle: StaticMappable {
//类型
var type: String?
//获取映射对象
class func objectForMapping(map: Map) -> BaseMappable? {
if let type: String = map["type"].value() {
switch type {
case "car":
return Car()
case "bus":
return Bus()
default:
return Vehicle()
}
}
return nil
}
init(){
}
func mapping(map: Map) {
type <- map["type"]
}
}
//小汽车
class Car: Vehicle {
//名字
var name: String?
override func mapping(map: Map) {
super.mapping(map: map)
name <- map["name"]
}
}
//公交车
class Bus: Vehicle {
//费用
var fee: Int?
override func mapping(map: Map) {
super.mapping(map: map)
fee <- map["fee"]
}
}
(2)下面我们将一个 JSON 字符串转为模型数组。注意 JSON 数据中包含多种类型的模型对象,通过 type 字段进行区分。
let JSON = [["type": "car", "name": "奇瑞QQ"],
["type": "bus", "fee": 2],
["type": "vehicle"]]
if let vehicles = Mapper<Vehicle>().mapArray(JSONArray: JSON){
print("交通工具数量:\(vehicles.count)")
if let car = vehicles[0] as? Car {
print("小汽车名字:\(car.name!)")
}
if let bus = vehicles[1] as? Bus {
print("公交车费用:\(bus.fee!) 元")
}
}
(3)运行结果如下:
全部评论(0)