13

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 プロトコルに準拠するために、モデル クラスは必要な初期化子と各フィールドのマッピング関数を実装する必要があります。それは理にかなっている。

しかし、どのように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( を使う代わりに for 座標データを使うことはかなり多いと思いますclass)

私の質問:

Q1. AlamofireObjectMapper または ObjectMapper ライブラリはstruct型をサポートしていますか? structタイプオブジェクトへのjson応答を解析するためにそれらを使用する方法は?

Q2. これらのライブラリが構造体型オブジェクトへの json 応答の解析をサポートしていない場合。iOS で Swift2 を使用する方法は何ですか?

4

1 に答える 1

11

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

マッピング可能なプロトコルは次のように定義されます

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

構造体を継承できないため、コンストラクターを必須としてマークできません。マッピング関数は、構造内に格納されたデータを変更するため、変更としてマークする必要があります...

于 2016-05-13T12:14:05.020 に答える