我需要在RealmSwift表示如下JSON方案:
{
"id": 1234,
"title": "some value",
"tags": [ "red", "blue", "green" ]
}
它是一种基本的字符串数组,我绊上。我猜的境界,我需要代表“标签”作为
dynamic id: Int = 0
dynamic title: String = ""
let tags = List<MyTagObject>()
制作标记自己的表领域,但如何将它与ObjectMapper地图?这是多远我有...
func mapping(map: Map) {
id <- map["id"]
title <- map["title"]
tags <- map["tags"]
}
...但标记线不编译,因为名单中,当然还有境界不能使用[字符串]类型。
这感觉就像一个有点常见的问题,我希望谁也面临这可以发表评论,或指向与建议后有人。
更新1 MyTagObject如下所示:
class MyTagObject: Object {
dynamic var name: String = ""
}
更新2我发现这个职位与境界对象交易,但假设数组已命名的元素,而不是一个简单的字符串。 https://gist.github.com/Jerrot/fe233a94c5427a4ec29b
首先,我们应该假定我们的模型同时扩展Object
和Mappable
。
让我们创建一个包装模型来存储原始(String
)类型:
class StringObject: Object {
dynamic var value = ""
}
然后,我们描述对应的根模型(未包装的一个)的属性和映射规则:
var tags = List<StringObject>()
var parsedTags: [String] {
var result = [String]()
for tag in tags {
result.append(tag.value)
}
return result
}
override static func ignoredProperties() -> [String] {
return ["parsedTags"]
}
func mapping(map: Map) {
if let unwrappedTags = map.JSON["tags"] as? [String] {
for tag in unwrappedTags {
let tagObject = StringObject()
tagObject.value = tag
tags.append(tagObject)
}
}
}
我们需要一个tags
属性来存储和获取数据有关的境界标签。然后一个parsedTags
属性简化在通常的阵列形式的标签提取。一个ignoredProperties
定义允许以避免一些故障与境界,而节省的数据(因为我们当然不能无境界的数据类型存储在域)。而在过去,我们是手工解析我们的标签在mapping
功能将其存储在王国。
它会工作,如果你的标签阵列将包含一个键一个Dictionary对象:“名”
{
"id": 1234,
"title": "some value",
"tags": [ ["name" : "red"], ... ]
}
如果你不能修改JSON对象,我建议你到JSON编程方式映射到的境界。
for tagName in tags {
let tagObject = MyTagObject()
tagObject.name = tagName
myObject.tags.append(tagObject)
}
我的解决方案是使用一个ObjectMapper TransformType
作为自定义方法的JSON映射到领域List<String>
类型。无需2个境界车型。
你的榜样JSON状况:
{
"id": 1234,
"title": "some value",
"tags": [ "red", "blue", "green" ]
}
TransformType
对象:import Foundation
import ObjectMapper
import RealmSwift
public struct StringArrayTransform: TransformType {
public init() { }
public typealias Object = List<String>
public typealias JSON = [String]
public func transformFromJSON(_ value: Any?) -> List<String>? {
guard let value = value else {
return nil
}
let objects = value as! [String]
let list = List<String>()
list.append(objectsIn: objects)
return list
}
public func transformToJSON(_ value: Object?) -> JSON? {
return value?.toArray()
}
}
import Foundation
import RealmSwift
import ObjectMapper
class MyObjectModel: Object, Mappable {
@objc dynamic id: Int = 0
@objc dynamic title: String = ""
let tags = List<MyTagObject>()
required convenience init?(map: Map) {
self.init()
}
func mapping(map: Map) {
id <- map["id"]
title <- map["title"]
tags <- (map["tags"], StringArrayTransform())
}
}
完成!
这条线是神奇的:tags <- (map["tags"], StringArrayTransform())
。这告诉ObjectMapper使用我们的定制StringArrayTransform
我发现上面这需要JSON字符串数组并将其转换为一个境界List<String>
。