在我的Realm对象模型中,我有一个名为“Event”的对象。每个事件都有一个EventLocatons列表。我试图从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是一个Event对象数组。它来自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协议映射自定义对象列表。 Whay是“eventLocations”列表总是空的吗?
答案 0 :(得分:10)
看一下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)
}
}
}
}
答案 1 :(得分:4)
另一种解决方案可能是为ObjectMapper实现自定义转换。 您可以找到实施here。
然后在你的代码中:
eventLocations <- (map["eventLocations"], ListTransform<EventLocation>())
答案 2 :(得分:1)
您可以为此添加运算符。
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