领域对象返回零(Swift)
Realm Object returning nil (Swift)
我有一个自定义多边形对象,因此我可以将地图叠加层保存到 Realm。我能够成功创建此对象,但是当我想检索 var 多边形对象时,它 returns nil。当我打印多边形对象时,它可以很好地打印出所有数据。
这是打印出来的示例。
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;
}, . . .
);
};
}
我的从 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)
}
}
我的类
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
}
您的 Object
子类的 String
、Double
和 Object
属性需要使用 dynamic
修饰符声明,以允许 Realm 覆盖getter 和 setter 的 属性。如果没有这个,Swift 编译器将直接访问对象的实例变量,这不会为 Realm 提供任何从 Realm 文件读取或写入数据的机会。请参阅 Realm 的 model property cheatsheet 以快速了解如何声明每种受支持类型的属性。
如果您在使用 try Realm()
returning nil
时遇到问题,请尝试从您的模拟器中删除应用程序并重新构建。在开发过程中更改 Object
属性可能会导致 try Realm()
到 return nil
.
我有一个自定义多边形对象,因此我可以将地图叠加层保存到 Realm。我能够成功创建此对象,但是当我想检索 var 多边形对象时,它 returns nil。当我打印多边形对象时,它可以很好地打印出所有数据。
这是打印出来的示例。
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;
}, . . .
);
};
}
我的从 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)
}
}
我的类
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
}
您的 Object
子类的 String
、Double
和 Object
属性需要使用 dynamic
修饰符声明,以允许 Realm 覆盖getter 和 setter 的 属性。如果没有这个,Swift 编译器将直接访问对象的实例变量,这不会为 Realm 提供任何从 Realm 文件读取或写入数据的机会。请参阅 Realm 的 model property cheatsheet 以快速了解如何声明每种受支持类型的属性。
如果您在使用 try Realm()
returning nil
时遇到问题,请尝试从您的模拟器中删除应用程序并重新构建。在开发过程中更改 Object
属性可能会导致 try Realm()
到 return nil
.