如何保存由结构体对象数组构成的Realm List?
解决Realm中保存结构体数组为List的问题
看起来你踩了Realm的一个常见坑:Realm的List<T>只能存储继承自Object的Realm模型类,不能直接存储普通Swift结构体。直接用结构体数组赋值肯定会报错,咱们一步步来解决:
1. 先定义对应的Realm模型类
首先要把你的结构体转换成Realm能识别的模型类,对应你说的“运动名称”和“重复次数”,可以这么写:
import RealmSwift // 这是Realm能识别的模型类,必须继承Object class WorkoutRecord: Object { // Realm 10+版本用@Persisted,旧版本用@objc dynamic @Persisted var exerciseName: String @Persisted var repeatCount: Int // 写一个便利初始化方法,方便从结构体转过来 convenience init(from structItem: YourStructType) { self.init() self.exerciseName = structItem.exerciseName // 替换成你结构体里的对应字段名 self.repeatCount = structItem.repeatCount // 同上 } }
这里的YourStructType是你原来的结构体类型,比如你可能定义了:
struct YourStructType { let exerciseName: String let repeatCount: Int }
2. 把结构体数组转成Realm模型数组,再赋值给List
假设你通过Segue拿到的结构体数组是var exerciseArray: [YourStructType],接下来要把它转换成List<WorkoutRecord>:
// 第一步:把每个结构体转成Realm模型实例 let realmModels = exerciseArray.map { WorkoutRecord(from: $0) } // 第二步:创建Realm的List,并批量添加元素 let exerciseList = List<WorkoutRecord>() exerciseList.append(objectsIn: realmModels)
3. 保存到Realm数据库
最后把这个List赋值给你的Realm父对象(如果有的话),然后在写事务里保存:
do { let realm = try Realm() try realm.write { // 假设你有一个包含List的父模型,比如ExercisePlan let plan = ExercisePlan() // 这个类也要继承Object,并且有@Persisted var exercises: List<WorkoutRecord>属性 plan.exercises = exerciseList realm.add(plan) } print("保存成功!") } catch { print("保存失败:\(error.localizedDescription)") }
为什么你之前会报错?
你提到的“use of undeclared type”大概率是因为:
- 直接把结构体作为
List的泛型参数(比如List<YourStructType>),Realm不识别这种非Object子类的类型 - 可能没正确导入
RealmSwift框架,或者模型类的写法不符合Realm要求
额外注意事项
- 确保所有Realm模型类都正确继承自
Object - 如果你用的是Realm旧版本(低于10.0),属性要写成
@objc dynamic var exerciseName: String = ""这种形式 - 所有写入操作必须放在
realm.write闭包里,否则会报错
内容的提问来源于stack exchange,提问作者nc14
相关产品推荐
相关产品推荐

