You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将包含其他结构体数组的结构体保存到Realm

解决结构体数组转Realm List对象的问题

我来帮你搞定这个数组转换的难题!其实核心就是把结构体数组里的每个元素逐个转换成对应的Realm对象,再添加到Realm的List集合里就行,下面一步步来:

第一步:确保Publisher实现完整的Persistable协议

你已经实现了从PublisherObject转Publisher的初始化方法,现在需要补上反向转换的managedObject()方法,这样每个Publisher结构体才能转成Realm能识别的PublisherObject:

extension Publisher: Persistable {
    // 你已经写过的从Realm对象转结构体的方法
    public init(managedObject: PublisherObject) {
        identifier = managedObject.identifier
        name = managedObject.name
    }
    
    // 新增:结构体转Realm对象的方法
    public func managedObject() -> PublisherObject {
        let publisherObj = PublisherObject()
        publisherObj.identifier = identifier
        publisherObj.name = name
        return publisherObj
    }
}

第二步:完善Character的managedObject()方法处理数组

接下来就是处理publisherArray的转换了。Realm的List是专属集合类型,不能直接用数组的赋值方式,需要逐个添加元素。另外建议你把CharacterObject里的publisherArray改成非可选类型(Realm的List默认初始化就是空列表,没必要用可选):

先优化CharacterObject的定义:

final class CharacterObject: Object {
    dynamic var identifier = 0
    dynamic var name = ""
    dynamic var realName = ""
    // 改成非可选的List,避免后续处理可选的麻烦
    let publisherArray = List<PublisherObject>()

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

然后修改Character的managedObject()方法:

public func managedObject() -> CharacterObject {
    let character = CharacterObject()
    character.identifier = identifier
    character.name = name
    character.realName = realName
    
    // 遍历结构体数组,逐个转成Realm对象并添加到List中
    publisherArray.forEach { publisher in
        character.publisherArray.append(publisher.managedObject())
    }
    
    return character
}

额外说明

因为你给PublisherObject设置了主键identifier,所以当你添加已存在主键的PublisherObject时,Realm会自动执行更新操作而不是重复创建,这也符合你基于主键做持久化的逻辑。

内容的提问来源于stack exchange,提问作者Michael Pohl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:55:45