我需要在 RealmSwift 中表示的是以下 JSON 方案:
{
"id": 1234,
"title": "some value",
"tags": [ "red", "blue", "green" ]
}
这是我遇到的一个基本字符串数组。我猜在 Realm 中我需要将“标签”表示为
dynamic id: Int = 0
dynamic title: String = ""
let tags = List<MyTagObject>()
在 Realm 中使标签成为自己的表,但如何使用 ObjectMapper 映射它?这就是我的进展......
func mapping(map: Map) {
id <- map["id"]
title <- map["title"]
tags <- map["tags"]
}
... 但是标签行当然不会编译,因为列表和 Realm 不能使用 [String] 类型。
这感觉像是一个有点普遍的问题,我希望遇到过这个问题的人可以发表评论或指向一个带有建议的帖子。
更新 1 MyTagObject 如下所示:
class MyTagObject: Object {
dynamic var name: String = ""
}
更新 2 我发现这篇文章处理 Realm 对象,但假设数组具有命名元素而不是简单的字符串。 https://gist.github.com/Jerrot/fe233a94c5427a4ec29b
最佳答案
我的解决方案是使用 ObjectMapper TransformType
作为将 JSON 映射到 Realm 的自定义方法 List<String>
类型。不需要 2 个 Realm 模型。
使用您的示例 JSON:
{
"id": 1234,
"title": "some value",
"tags": [ "red", "blue", "green" ]
}
- 首先,创建一个 ObjectMapper
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()
}
}
- 创建用于存储 JSON 数据的 1 个 Realm 模型:
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 String 数组并将其转换为 Realm List<String>
.
关于swift - RealmSwift + ObjectMapper 管理字符串数组(标签),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40073212/