RealmSwift + ObjectMapper管理字符串数组(标签)

问题描述 投票:3回答:3

我需要在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

swift realm objectmapper
3个回答
3
投票

首先,我们应该假定我们的模型同时扩展ObjectMappable

让我们创建一个包装模型来存储原始(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功能将其存储在王国。


1
投票

它会工作,如果你的标签阵列将包含一个键一个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)
}

1
投票

我的解决方案是使用一个ObjectMapper TransformType作为自定义方法的JSON映射到领域List<String>类型。无需2个境界车型。

你的榜样JSON状况:

{ 
    "id": 1234,
    "title": "some value",
    "tags": [ "red", "blue", "green" ]
}
  1. 首先,创建一个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()
    }

}

  1. 创建用于存储JSON数据的1个域模型:
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>

© www.soinside.com 2019 - 2024. All rights reserved.