今天在修改接口返回字段的时候发现,不同的接口返回相同内容的字段的类型不一致,导致使用
ObjectMapper
转换成模型的时候,有一个接口返回的数据转换失败,导致模型的字段为nil。
比如:如下模型的创建
struct MoveResult: Mappable {
var id: String!
var url:String!
var share_url:String!
var operators:String!
var download:Float!
var upload:Float!
init?(map: Map) { }
mutating func mapping(map: Map) {
id <- map["id"]
url <- map["url"]
share_url <- map["share_url"]
operators <- map["operator"]
download <- map["download"]
upload <- map["upload"]
}
}
其中download
, upload
两个字段在一个接口中返回的是数值类型,在另外一个接口中返回的是字符串类型;此时,你如果在模型中声明的是Float
类型,那么在字符串类型的那个接口中,这2个字段的值就是nil
,如果声明String
类型,在数值类型的那个接口中,这2个字段的值就是nil
。
解决办法:在模型中创建转换方法
- Int的转换
public class IntTransform: TransformType {
public typealias Object = Int
public typealias JSON = Any?
public init() {}
public func transformFromJSON(_ value: Any?) -> Int? {
var result: Int?
guard let json = value else {
return result
}
/// 如果是数值类型,小数等,需要用NSNumber
if json is NSNumber {
result = (json as! NSNumber).intValue
}
if json is Int {
result = (json as! Int)
}
if json is String {
result = Int(json as! String)
}
return result
}
public func transformToJSON(_ value: Int?) -> Any?? {
guard let object = value else {
return nil
}
return String(object)
}
}
- Float的转换(与Int类似)
- Double的转换(与Int类似)
在模型中使用
struct MoveResult: Mappable {
var id: String!
var url:String!
var share_url:String!
var operators:String!
var download:Float!
var upload:Float!
init?(map: Map) { }
mutating func mapping(map: Map) {
id <- map["id"]
url <- map["url"]
share_url <- map["share_url"]
operators <- map["operator"]
download <- (map["download"], FloatTransform())
upload <- (map["upload"], FloatTransform())
}
}
问题解决!
一步一个巴掌印。。。