ObjectMapper模型字段类型转换(Swift)

2020-06-18  本文已影响0人  iLeooooo

今天在修改接口返回字段的时候发现,不同的接口返回相同内容的字段的类型不一致,导致使用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"]
    }
}

其中downloadupload 两个字段在一个接口中返回的是数值类型,在另外一个接口中返回的是字符串类型;此时,你如果在模型中声明的是Float类型,那么在字符串类型的那个接口中,这2个字段的值就是nil,如果声明String类型,在数值类型的那个接口中,这2个字段的值就是nil

解决办法:在模型中创建转换方法

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)
    }
}

在模型中使用

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())
    }
}

问题解决!

一步一个巴掌印。。。

上一篇 下一篇

猜你喜欢

热点阅读