2016-05-13 32 views
8

Sto utilizzando AlamofireObjectMapper per analizzare la risposta di JSON al mio oggetto. AlamofireObjectMapper è un'estensione di ObjectMapper.AlamofireObjectMapper/ObjectMapper supporta il mapping del tipo di struct

Secondo i loro documenti, la mia classe modello deve essere conforme al protocollo Mappable. Per esempio:

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

al fine di conformarsi al protocolllo Mappable, la mia classe del modello deve implementare l'inizializzatore richiesta e la funzione di mappatura per ogni campo. Ha senso.

MA, come supporta il tipo struct? Per esempio, ho una struttura Coordinate, cerco di conformarsi al protocollo 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"] 
    } 
} 

non riesco a fare il mio Coordinate conforme al Mappable, a causa dell'errore mostro sopra.

(penso che sia abbastanza spesso che l'utilizzo struct per coordinare i dati invece di utilizzare class)

Le mie domande:

Q1. La libreria AlamofireObjectMapper o ObjectMapper supporta il tipo struct? Come usarli analizzando la risposta JSON a un oggetto di tipo struct quindi?

Q2. Se tali librerie non supportano l'analisi della risposta JSON all'oggetto del tipo struct. Qual è il modo di farlo in iOS con Swift2?

risposta

7

protocollo Mappable viene definito in questo modo

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

Bisogna implementare di conseguenza:

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

    init?(_ map: Map) { 
    } 

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

o

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

Constructor non possono essere contrassegnati come richiesto perché struct non può essere ereditato. la funzione di mappatura deve essere contrassegnata come mutante perché muta i dati memorizzati nella struttura ...