swift2 是否支持结构类型Map

w8f9ii69  于 2022-11-23  发布在  Swift
关注(0)|答案(1)|浏览(333)

我正在使用AlamofireObjectMapper来解析json对我的对象的响应。AlamofireObjectMapper是ObjectMapper的扩展。
根据他们的文档,我的模型类必须符合Mappable协议。例如:

class Forecast: Mappable {
    var day: String?
    var temperature: Int?
    var conditions: String?

    required init?(_ map: Map){

    }

    func mapping(map: Map) {
        day <- map["day"]
        temperature <- map["temperature"]
        conditions <- map["conditions"]
    }
}

为了符合Mappable协议,我的模型类必须实现所需的初始化器和每个字段的Map函数。这是有意义的。

**但是,它如何支持struct类型?**例如,我有一个Coordinate结构,我尝试符合Mappable协议:

struct Coordinate: Mappable {
    var xPos: Int
    var yPos: Int

    // ERROR: 'required' initializer in non-class type
    required init?(_ map: Map) {}

    func mapping(map: Map) {
        xPos <- map["xPos"]
        yPos <- map["yPos"]
    }
}

由于上面显示的错误,我无法使我的Coordinate符合Mappable。
(我认为经常使用struct作为坐标数据,而不是使用class

我的问题
**问题1.**AlamofireObjectMapper或ObjectMapper库是否支持struct类型?如何使用它们解析对struct类型对象的json响应?
**Q2.**如果这些库不支持解析json对struct类型对象的响应,那么在iOS的Swift2中如何做到这一点?

ubbxdtey

ubbxdtey1#

BaseMappable协议是这样定义的,因此您应该声明每个方法以符合Mappable

/// BaseMappable should not be implemented directly. Mappable or StaticMappable should be used instead
public protocol BaseMappable {
    /// This function is where all variable mappings should occur. It is executed by Mapper during the mapping (serialization and deserialization) process.
    mutating func mapping(map: Map)
}

可Map协议的定义如下

public protocol Mappable: BaseMappable {
    /// This function can be used to validate JSON prior to mapping. Return nil to cancel mapping at this point
    init?(map: Map)
}

您必须相应地实施它:

struct Coordinate: Mappable {
    var xPos: Int?
    var yPos: Int?
    
    init?(_ map: Map) {
    }

    mutating func mapping(map: Map) {
        xPos <- map["xPos"]
        yPos <- map["yPos"]
    }
}

struct Coordinate: Mappable {
    var xPos: Int
    var yPos: Int
    
    init?(_ map: Map) {
    }

    mutating func mapping(map: Map) {
        xPos <- map["xPos"] ?? 0
        yPos <- map["yPos"] ?? 0
    }
}

构造函数***不能标记为必需***,因为无法继承该结构Map函数必须标记为正在变更,因为该函数会变更结构中存储数据...

相关问题