2016-07-29 18 views
7

Używam obiektu ObjectMapper do rzutowania json w obiekty. Mój problem polega na tym, że właściwość NSDate nie jest poprawnie mapowana. Oto json:Swift i ObjectMapper: NSDate z wartością minimalną

{ 
    "Id":4775, 
    "Cor":{ 
     "Id":2, 
     "Nome":"Amarelo", 
     "HTMLCode":"FFFB00" 
    }, 
    "Data":"2016-07-25T09:35:00", 
    "Texto":"test test test", 
    "Kilometro":547.0 
} 

I tu jest moje odwzorowywalne klasa

class RoadWarning : Mappable { 

    var id: Int? 
    var color: RoadWarningColor? 
    var date: NSDate? 
    var text: String? 
    var kilometer: Float? 

    required init?(_ map: Map){ 

    } 

    func mapping(map: Map) { 
     id <- map["Id"] 
     color <- map["Cor"] 
     text <- map["Texto"] 
     kilometer <- map["Kilometro"] 
     date <- (map["Data"], DateTransform()) 
    } 
} 

Problemem jest to, że nieruchomość jest zawsze data 1970-01-01. Nie widzę jeszcze tego, czego mi brakuje. Czy widzisz, co jest nie tak w tym mapowaniu?

Dzięki

Odpowiedz

7

ObjectMapper nie przekonwertować z String do NSDate właściwie trzeba zrobić obejście tak aby określić typ formatu NSDate to trzeba konwertować z String:

func mapping(map: Map) { 
    id <- map["Id"] 
    color <- map["Cor"] 
    text <- map["Texto"] 
    kilometer <- map["Kilometro"] 

    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 

    if let dateString = map["Data"].currentValue as? String, let _date = dateFormatter.dateFromString(dateString) { 
     date = _date 
    } 
} 

I mam nadzieję, że ci to pomoże.

+1

Dzięki! Tak było. Właśnie musiałem zmienić ten wiersz dateFormatter.dateFormat = "rrrr-MM-dd'T'HH: mm: ss" –

+0

Tak, przykro mi, masz rację :) –

+0

To nie jest dobre podejście, transformacje są właściwym sposobem ustaw poprawnie dane. Wbudowany DateTransform używa timeIntervalSince1970, więc nie będzie działać z sformatowaną datą. Najlepszym rozwiązaniem jest stworzenie własnego DateTransform, jak zrobił to Rodolfo poniżej. – Leon

6

Można po prostu utworzyć klasę TransformType umożliwiając dateformat jako parametr:

// DateFormatTransform.swift 

    import Foundation 
    import ObjectMapper 
    public class DateFormatTransform: TransformType { 
     public typealias Object = NSDate 
     public typealias JSON = String 


    var dateFormat = NSDateFormatter(dateFormat: "yyyy-MM-dd HH:mm:ss") 

    convenience init(dateFormat: String) { 
     self.init() 
     self.dateFormat = NSDateFormatter(dateFormat: dateFormat) 
    } 

    public func transformFromJSON(value: AnyObject?) -> Object? { 
     if let dateString = value as? String { 
      return self.dateFormat.dateFromString(dateString) 
     } 
     return nil 
    } 
    public func transformToJSON(value: NSDate?) -> JSON? { 
     if let date = value { 
      return self.dateFormat.stringFromDate(date) 
     } 
     return nil 
    } 
} 

i używać go tak:

func mapping(map: Map) { 
    id <- map["Id"] 
    color <- map["Cor"] 
    text <- map["Texto"] 
    kilometer <- map["Kilometro"] 
    date <- (map["Data"], DateFormatTransform(dateFormat: "yyyy-MM-dd")) 
} 
+0

Nawiasem mówiąc, zrobiłem sedno [DateFormatTransform.swift] (https://gist.github.com/RodolfoAntonici/2c446d829ddefc19afe0635ce2977d2d) – RodolfoAntonici

+0

Czy możesz zaktualizować swój kod dla najnowszej wersji Swift? Dzięki! –

Powiązane problemy