2015-05-05 20 views
7

Mam szybki model o nazwie Activity, który może opcjonalnie mieć dołączoną do niego coordinate.RestKit RKObjectMapping Swift Opcjonalnie

import MapKit 

class Activity: NSObject { 

    var coordinate: CLLocationCoordinate2D? 

    class func objectMapping() -> RKObjectMapping { 
     let mapping = RKObjectMapping(forClass: self) 

     let coordinateMapping = RKAttributeMapping(fromKeyPath: "coordinate", toKeyPath: "coordinate") 
     coordinateMapping.valueTransformer = RKCLLocationCoordinate2DValueTransformer() 
     mapping.addPropertyMapping(coordinateMapping) 

     return mapping 
    } 
} 

Podczas uruchamiania mojej aplikacji to jednak daje mi:

2015-05-05 12: 14: 30,741 próbki [54338: 531558] *** Zakończenie aplikację spowodowane nieprzechwyconego wyjątku 'NSUnknownKeyException' , reason: '[setValue: forUndefinedKey:]: ta klasa nie jest zgodna z kodowaniem kluczem wartości kluczowej. "

Jeśli zmienię coordinate na opcję nieobowiązkową i podam domyślną aplikację, która działa.

Moje pytanie brzmi: jak używać RestKit w wersji szybkiej w odniesieniu do opcji?

+0

Dlaczego ma to być opcja, gdy jest to zwykły numer? Prawdopodobnie kompilator nie generuje akcesorów dla właściwości, jeśli są one opcjonalne ... – Wain

+0

Nie wszystkie czynności mają przypisaną szerokość i długość geograficzną, więc myślałem, że to zrobi, ponieważ jest to opcjonalne. Widzę twój punkt dla regularnych liczb, ale mógłbym postawić to samo pytanie dla czegoś bardziej złożonego jak 'CLLocationCoordinate2D' –

+0

Nigdy nie używałem RestKit, więc nie jestem pewien wewnętrznych działań ... jednak przeglądałem źródło i znalazłem to w implementacji dla inicjalizatora dla 'RKAttributeMapping' (' RKAttributeMapping (fromKeyPath: "coordinate", toKeyPath: "coordinate") ') ... pierwsza linia kodu w inicjalizatorze to:' NSAssert (sourceKeyPath || destinationKeyPath , @ "Zarówno ścieżka źródłowa, jak i docelowa nie mogą być puste"); '. Dla mnie oznacza to, że katastrofa jest spowodowana, ponieważ "współrzędna" jest opcjonalna (a więc 'nil') i' współrzędna' jest używana dla obu keypathów (i dlatego oba są 'nil'). –

Odpowiedz

-1

moim zdaniem swoimi awarii aplikacji z tego powodu linie

let mapping = RKObjectMapping(forClass: self) let coordinateMapping = RKAttributeMapping(fromKeyPath: "coordinate", toKeyPath: "coordinate")

Chcesz map opcjonalnego nieruchomość/zmienna, ale może się okazać, że w momencie, gdy dzwoni objectMapping() swój coordinate jest zerowe.

Próbowałeś coś takiego:

import MapKit 

class Activity: NSObject { 

    var coordinate: CLLocationCoordinate2D? 

    class func objectMapping() -> RKObjectMapping { 

     if let c = self. coordinate { 
      let mapping = RKObjectMapping(forClass: self) 

      let coordinateMapping = RKAttributeMapping(fromKeyPath: "coordinate", toKeyPath: "coordinate") 
      coordinateMapping.valueTransformer = RKCLLocationCoordinate2DValueTransformer() 
      mapping.addPropertyMapping(coordinateMapping) 

      return mapping 
     } 
     return nil 
    } 
} 

Nie jestem pewien, czy to działa, ale myślę, let mapping = RKObjectMapping(forClass: self) próbuje mapie całą swoją klasę Activity i wywala ten kod, gdy coordinate nie jest ustawiony na tym razem.

+0

'objectMapping' jest funkcją klasy. "współrzędna" nigdy nie miałaby wartości w tym kontekście. –

0

Dodać nieruchomość dynamic

dynamic var coordinate: CLLocationCoordinate2D?