【问题标题】:Unbox + Realm native "List" objectUnbox + Realm 原生“列表”对象
【发布时间】:2025-12-11 08:05:02
【问题描述】:

更新

Unbox 库的作者终于回答了我的问题。 https://github.com/JohnSundell/Unbox/issues/156


我正在尝试使用Unbox 使Realm 对象与内部使用List 的其他相关对象。来自服务器的JSON 响应具有这种结构。

[
  {
    "name": "bla bla",
    "desc": "bla bla",
    "sequential": true,
    "createdAt": "2017-01-23T09:58:05.095Z",
    "hmImages": [
      {
        "urlBase": "https://blabla.com",
        "fullresPath": "/blaPath/iyba783fR81L8y.jpg",
        "id": "bla bla"
      },
      {
        "urlBase": "https://blabla.com",
        "fullresPath": "/blaPath/iyba783fR81L8y.jpg",
        "id": "bla bla"
      }
    ],
    "tags": [],
    "id": "bla bla"
  },
  {
    "name": "bla bla",
    "desc": "bla bla",
    "sequential": true,
    "createdAt": "2017-01-23T09:58:05.095Z",
    "hmImages": [
      {
        "urlBase": "https://blabla.com",
        "fullresPath": "/blaPath/iyba783fR81L8y.jpg",
        "id": "bla bla"
      }
    ]
    "tags": [],
    "id": "bla bla"
  }
]

请注意,根对象是字典的Array。每个字典都有一个Array 的图像字典。

Realm 中保存对象的类如下所示:

// MARK: - Realm
final class Challenge: Object {

    dynamic var id = ""
    dynamic var name = ""
    dynamic var desc = ""
    dynamic var sequential = false
    dynamic var createdAt = Date()
    dynamic var btPlayground = ""

    // Relations
    let hmImages = List<Image>()
    let tags = List<Tag>()

    override static func primaryKey() -> String? {
        return "id"
    }

}

// MARK: - Unboxable
extension Challenge: Unboxable {

    convenience init(unboxer: Unboxer) throws {
        self.init()

        // Date formatter
        let dateFormatter = ISODateFormatter()

        id = try unboxer.unbox(key: "id")
        name = try unboxer.unbox(key: "name")
        desc = try unboxer.unbox(key: "desc")
        sequential = try unboxer.unbox(key: "sequential")
        createdAt = try unboxer.unbox(key: "createdAt", formatter: dateFormatter)
        btPlayground = try unboxer.unbox(key: "btPlayground")

    }

}

hmImages keypath 出现问题。 Unbox 无法自动解析,我需要一种方法来做到这一点。

我尝试了UnboxableByTransform,如下所示:

extension List<T>: UnboxableByTransform {

    public typealias UnboxRawValue = [[String:Any]]

    public static func transform(unboxedValue: Array<[UnboxableDictionary]>) -> List<T>? {


    }

}

但是没有用。 有什么想法吗?

谢谢!

【问题讨论】:

    标签: ios swift realm unbox


    【解决方案1】:

    你只是做错了。对于 json,请阅读 here

    如果你坚持自己的方式。您应该考虑到 Realm 不接受您在 public typealias UnboxRawValue = [[String:Any]] 中使用的 Any 类型,您只能使用 Realm 列出的类型。即 Bool、Int8、Int16、Int32、Int64、Double、Float、String、NSDate 和 NSData。

    【讨论】:

      最近更新 更多