2016-05-30 19 views
5

Ich habe ein benutzerdefiniertes Polygon-Objekt, damit ich Karten-Overlays in Realm speichern kann. Ich bin in der Lage, diese Objekte erfolgreich zu erstellen, aber wenn ich das VAR-Polygon-Objekt abrufen möchte, gibt es NULL zurück. Wenn ich das Polygon-Objekt drucke, wird es mit allen Daten ausgedruckt.Realm-Objekt, das Null zurückgibt (Swift)

Dies ist ein Beispiel dafür, was gedruckt wird.

CustomPolygon { 
    name = Polygon1; 
    id = p1; 
    polygon = Polygon { 
     coordinates = RLMArray <0x7f928ef36230> (
      [0] Coordinate { 
       latitude = -36.914167; 
       longitude = 174.904722; 
      }, 
      [1] Coordinate { 
       latitude = -36.9325; 
       longitude = 174.957222; 
      }, . . . 
     ); 
    }; 
} 

Meine Funktion zum Laden von Daten aus Realm

func loadOverlaysFromRealm(){ 

    do { 

     let realm = try Realm() 

     let polygons = realm.objects(CustomPolygon) 

     for p in polygons { 

      var coordinates = [CLLocationCoordinate2D]() 

      print(p) // !!!!! prints out what is above 
      print(p.polygon) // !!!!! Returns nil. 

      if let coordinateList = p.polygon?.coordinates as? List<Coordinate> { 

       for coordinate in coordinateList { 
        coordinates.append(CLLocationCoordinate2DMake(coordinate.latitude, coordinate.longitude)) 
       } 
      } 
      print(coordinates) // prints "[]" 
      let polygon = MKPolygon(coordinates: &coordinates, count: coordinates.count) 
      self.map.addOverlay(polygon) 

     } 

    } catch let error as NSError { 
     print(error.localizedDescription) 
    } 
} 

Meine Klassen

class CustomPolygon: Object { 

    var name:String = "" 
    var id:String = "" 
    var polygon:Polygon? = nil 

} 

class Polygon: Object { 
    var coordinates = List<Coordinate>() 
} 

class Coordinate: Object { 
    var latitude:Double = 0.0 
    var longitude:Double = 0.0 
} 

Antwort

9

Die String, Double und Object Eigenschaften Ihrer Object Subklassen müssen mit dem dynamic Modifikator deklariert werden Erlaube Realm, den Getter und Setter der Eigenschaft zu überschreiben. Ohne diese Option greift der Swift-Compiler direkt auf die Instanzvariable des Objekts zu, wodurch Realm keine Möglichkeit erhält, Daten aus der Realm-Datei zu lesen oder zu schreiben. Ein kurzer Überblick über das Deklarieren der Eigenschaften der einzelnen unterstützten Typen finden Sie in Realms model property cheatsheet.