BetterMappable
Better Mappable 通过属性包装器,是一个用 Swift 编写的框架,它可以帮助您轻松地将您的模型对象(类和结构体)转换为 JSON 并从 JSON 转换,这是通过使用 ObjectMapper
实现的。这有助于在您的模型中减少许多样板代码。
基础
提供了 3 个属性包装器供您使用
JSONProperty
使用此属性包装器将任何原始变量(如 Int
、String
、Bool
等)映射
struct User: Mappable {
@JSONProperty var name: String?
@JSONProperty var age: Int?
@JSONProperty var onPhonePe: Bool?
init?(map: Map) {
}
}
就是这样。是的!您看对了。您根本不需要实现 func mapping(map: Map)
。我们将自动获取变量名称并从 JSON 中分配正确的值。如果您的变量名称与 JSON 中的 key
不同,您可以在 JSONProperty
中提供它作为参数。
@JSONProperty(key: "on_phonepe")
var onPhonePe: Bool?
您可以为变量提供默认值,就像您通常使用 ObjectMapper
那样。
@JSONProperty
var age: Int = 0
@JSONProperty(key: "on_phonepe")
var onPhonePe: Bool = false
JSONObject
使用此属性包装器将符合 Mappable
协议的自定义类/结构体映射
struct Student: Mappable {
@JSONObject var address: Address?
@JSONProperty var firstName: String?
@JSONProperty var lastName: String?
init?(map: Map) {
}
}
struct Address: Mappable {
@JSONProperty var street: String?
@JSONProperty var building: String?
@JSONProperty var city: String?
@JSONProperty var state: String?
init?(map: Map) {
}
}
与 JSONProperty
示例类似,如果你的变量名与JSON中的 key
不同,你可以将其作为参数传递给 JSONObject
。
@JSONObject(key: "student_address")
var address: Address?
JSONPropertyWithTransform
使用此属性包装器来映射具有转换的变量。
struct Organization: Mappable {
enum Sector: String {
case `private` = "PRIVATE"
case `public` = "PUBLIC"
}
@JSONPropertyWithTransform(transformer: DateTransform())
var startDate: Date?
@JSONPropertyWithTransform(transformer: EnumTransform<Sector>())
var sector: Sector?
@JSONProperty var name: String?
init?(map: Map) {
}
}
这个是否与 StaticMappable 一起工作?
是的,可以。
class Vehicle {
enum VehicleType: String {
case car = "CAR"
case bicycle = "BICYCLE"
}
@JSONProperty var numberOfWheels: Int?
}
extension Vehicle: StaticMappable {
static func objectForMapping(map: Map) -> BaseMappable? {
if let rawType = map.JSON["type"] as? String,
let type = VehicleType(rawValue: rawType) {
switch type {
case .car:
return Car()
case .bicycle:
return Bicycle()
}
}
return nil
}
}
class Car: Vehicle {
@JSONProperty var hasBonet: Bool?
}
class Bicycle: Vehicle {
@JSONProperty var modelName: String?
}
子类
class Base: Mappable {
@JSONProperty var base: String?
required init?(map: Map) {
}
}
class Subclass: Base {
@JSONProperty var sub: String?
required init?(map: Map) {
super.init(map: map)
}
}
安装
BetterMappable
可以通过添加以下行到你的 Podfile
来添加到你的项目中使用 CocoaPods
pod 'BetterMappable'