2016-05-13 8 views
8

Korzystam z AlamofireObjectMapper do parsowania odpowiedzi json na mój obiekt. AlamofireObjectMapper jest rozszerzeniem ObjectMapper.Czy AlamofireObjectMapper/ObjectMapper obsługuje mapowanie typu struktury

Zgodnie z ich dokumentami, moja klasa modelu musi być zgodna z protokołem Mappable. Na przykład:

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

w celu dostosowania się do odwzorowywalne protocl, moja klasa model ma wdrożyć wymagane inicjator i funkcję mapowania dla każdego pola. To ma sens.

ALE, w jaki sposób obsługuje typ struct? Na przykład, mam Coordinate struktury, staram się być zgodne z protokołem 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"] 
    } 
} 

nie mogę uczynić mój Coordinate zgodne z odwzorowywalne, z powodu błędu pokażę powyżej.

(myślę, że jest to dość często, że za pomocą struct dla danych współrzędnych zamiast korzystania class)

Moje pytania:

Q1. Czy biblioteka AlamofireObjectMapper lub ObjectMapper obsługuje typ struct? Jak używać ich do analizowania odpowiedzi json na obiekt typu struct?

Q2. Jeśli te biblioteki nie obsługują analizy odpowiedzi json na obiekt typu struct. Jak to zrobić w iOS z Swift2?

Odpowiedz

7

odwzorowywalne protokół jest zdefiniowany jak ten

public protocol Mappable { 
    init?(_ map: Map) 
    mutating func mapping(map: Map) 
} 

Trzeba wdrożyć go odpowiednio:

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

    init?(_ map: Map) { 
    } 

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

lub

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

Konstruktor nie mogą być oznaczone jako wymagane ponieważ struct nie może zostać odziedziczony. funkcja mapowania musi być oznaczona jako mutująca, ponieważ mutuje przechowywane dane w strukturze ...