如何在 Swift 中使用 Mappable 协议映射自定义对象的领域列表
How to map a realm list of custom objects using Mappable protocol in Swift
在我的 Realm 对象模型中,我有一个名为 "Event" 的对象。每个事件都有一个事件位置列表。我正在尝试从 json 映射这些对象,但 EventLocations 列表始终为空。
对象看起来像这样(为清楚起见进行了简化):
class Event: Object, Mappable {
override class func primaryKey() -> String? {
return "id"
}
dynamic var id = ""
var eventLocations:List<EventLocation> = List<EventLocation>()
func mapping(map: Map) {
id <- map["id"]
eventLocations <- map["eventLocations"]
}
}
class EventLocation: Object, Mappable {
override class func primaryKey() -> String? {
return "id"
}
dynamic var id: String = ""
dynamic var name: String = ""
required convenience init?(_ map: Map) {
self.init()
}
func mapping(map: Map) {
id <- map["id"]
name <- map["name"]
}
}
我拥有的 json 是一个事件对象数组。它来自 Alamofire 响应,我这样映射它:
var events = Mapper<Event>().mapArray(json!)
json 看起来像这样:
[
{
"id" : "21dedd6d",
"eventLocations" : [
{
"name" : "hh",
"id" : "e18df48a",
},
{
"name" : "tt",
"fileId" : "be6116e",
}
]
},
{
"id" : "e694c885",
"eventLocations" : [
{
"name" : "hh",
"id" : "e18df48a",
},
{
"name" : "tt",
"fileId" : "be6116e",
}
]
}
]
有谁知道如何使用 Mappable 协议映射自定义对象列表。为什么 "eventLocations" 列表总是空的?
查看 one of the Issues page on ObjectMapper's GitHub repo,似乎 Realm List
对象尚未得到正确支持。
该问题还列出了使其暂时可用的潜在解决方法,我将在此处反映:
class MyObject: Object, Mappable {
let tags = List<Tag>()
required convenience init?(_ map: Map) { self.init() }
func mapping(map: Map) {
var tags: [Tag]?
tags <- map["tags"]
if let tags = tags {
for tag in tags {
self.tags.append(tag)
}
}
}
}
另一种解决方案可能是为 ObjectMapper 实现自定义转换。
你可以找到一个实现 here.
然后在你的代码中:
eventLocations <- (map["eventLocations"], ListTransform<EventLocation>())
您可以为此添加一个运算符。
Swift 3 实现:
import Foundation
import RealmSwift
import ObjectMapper
infix operator <-
/// Object of Realm's List type
public func <- <T: Mappable>(left: List<T>, right: Map) {
var array: [T]?
if right.mappingType == .toJSON {
array = Array(left)
}
array <- right
if right.mappingType == .fromJSON {
if let theArray = array {
left.append(objectsIn: theArray)
}
}
}
现在您不需要任何额外的代码或转换。
list <- map["name"]
我创建了一个要点。请检查 https://gist.github.com/danilValeev/ef29630b61eed510ca135034c444a98a
在我的 Realm 对象模型中,我有一个名为 "Event" 的对象。每个事件都有一个事件位置列表。我正在尝试从 json 映射这些对象,但 EventLocations 列表始终为空。 对象看起来像这样(为清楚起见进行了简化):
class Event: Object, Mappable {
override class func primaryKey() -> String? {
return "id"
}
dynamic var id = ""
var eventLocations:List<EventLocation> = List<EventLocation>()
func mapping(map: Map) {
id <- map["id"]
eventLocations <- map["eventLocations"]
}
}
class EventLocation: Object, Mappable {
override class func primaryKey() -> String? {
return "id"
}
dynamic var id: String = ""
dynamic var name: String = ""
required convenience init?(_ map: Map) {
self.init()
}
func mapping(map: Map) {
id <- map["id"]
name <- map["name"]
}
}
我拥有的 json 是一个事件对象数组。它来自 Alamofire 响应,我这样映射它:
var events = Mapper<Event>().mapArray(json!)
json 看起来像这样:
[
{
"id" : "21dedd6d",
"eventLocations" : [
{
"name" : "hh",
"id" : "e18df48a",
},
{
"name" : "tt",
"fileId" : "be6116e",
}
]
},
{
"id" : "e694c885",
"eventLocations" : [
{
"name" : "hh",
"id" : "e18df48a",
},
{
"name" : "tt",
"fileId" : "be6116e",
}
]
}
]
有谁知道如何使用 Mappable 协议映射自定义对象列表。为什么 "eventLocations" 列表总是空的?
查看 one of the Issues page on ObjectMapper's GitHub repo,似乎 Realm List
对象尚未得到正确支持。
该问题还列出了使其暂时可用的潜在解决方法,我将在此处反映:
class MyObject: Object, Mappable {
let tags = List<Tag>()
required convenience init?(_ map: Map) { self.init() }
func mapping(map: Map) {
var tags: [Tag]?
tags <- map["tags"]
if let tags = tags {
for tag in tags {
self.tags.append(tag)
}
}
}
}
另一种解决方案可能是为 ObjectMapper 实现自定义转换。 你可以找到一个实现 here.
然后在你的代码中:
eventLocations <- (map["eventLocations"], ListTransform<EventLocation>())
您可以为此添加一个运算符。
Swift 3 实现:
import Foundation
import RealmSwift
import ObjectMapper
infix operator <-
/// Object of Realm's List type
public func <- <T: Mappable>(left: List<T>, right: Map) {
var array: [T]?
if right.mappingType == .toJSON {
array = Array(left)
}
array <- right
if right.mappingType == .fromJSON {
if let theArray = array {
left.append(objectsIn: theArray)
}
}
}
现在您不需要任何额外的代码或转换。
list <- map["name"]
我创建了一个要点。请检查 https://gist.github.com/danilValeev/ef29630b61eed510ca135034c444a98a