保存由结构对象数组组成的领域列表

时间:2018-04-30 14:20:50

标签: ios swift realm swift4

问题 我需要在Realm中保存一个List,它由一个结构对象数组的属性组成(它已经通过Segue传递并且正在播放一个tableview)。这是每行上“练习名称”和“代表数量”的形式。

我尝试了什么? 我已经根据字段和格式将Realm对象与Struct匹配,并尝试将数组保存为列表,例如“= List< array>”但这不起作用(“使用未声明的类型”)。我也尝试了各种方法来尝试保存每个表行的属性但是再次无法使其工作(例如= cell.workoutname)

研究我发现这个How to save a struct to realm in swift?但是,这不是用于保存我不认为的对象数组。然而,这个确实(第一个答案),让我想到可能将每行中包含的值保存到Realm而不是实际的Struct数组。我也发现了这个Saving Array to Realm in Swift?,但我认为这是因为数组已经由Realm Objects组成,而不是像我的情况那样的Struct实例。

代码和详细信息

的Structs

我有一个结构如下。另一个结构(Workout Generator)具有一个生成这些对象的x个实例的函数。然后通过Segue将它们传递给新的VC TableView(每行显示一个锻炼名称和代表数量):

struct WorkoutExercise : Hashable, Equatable{

    let name : String
    let reps : Int
    var hashValue: Int {
        return name.hashValue
    }

    static func == (lhs: WorkoutExercise, rhs: WorkoutExercise) -> Bool {
        return lhs.name == rhs.name
    }


}

然后我有以下Realm对象。一个是保存'WorkoutSession'。这将包含WorkoutExercise Realm对象的Realm List。

class WorkoutSessionObject: Object {
    @objc dynamic var workoutID = UUID().uuidString
    @objc dynamic var workoutName = ""
    let exercises = List<WorkoutExerciseObject>()
    var totalExerciseCount: Int {
        return exercises.count
    }
}

class WorkoutExerciseObject: Object {
    @objc dynamic var name = ""
    @objc dynamic var reps = 0
}

尝试将Workout详细信息保存到Realm时,我尝试了以下代码:

func saveToRealm() {
        let workoutData = WorkoutSessionObject()
        workoutData.workoutName = "test"
        workoutData.workoutID = UUID().uuidString
        workoutData.exercises = List<selectedWorkoutExerciseArray>
    }

认为我需要做的就是阅读其他答案

选项1 - 而不是尝试保存实际数组,而是保存每个表行的“名称”和“代表”?

选项2 - 以某种方式将'selectedWorkoutExerciseArray'转换为领域对象列表?

当然可能还有其他选择!任何帮助/想法赞赏!

2 个答案:

答案 0 :(得分:1)

为什么要填充2个单独的列表,如果它还需要持久化?只需使用Realm中的列表填充表格视图即可。这是一个使用append填充列表的简单示例(就像任何数组一样):

class SomeClass: Object {
    @objc dynamic var id: String = ""
    var someList = List<SomeOtherClass>()

    convenience init(id: String) {
        self.init()

        self.id = id
    }
}

@objcMembers class SomeOtherClass: Object {
    dynamic var someValue: String = ""

    convenience init(value: String) {
        self.init()

        someValue = value
    }
}

func addToList(someOtherClass: SomeOtherClass) {

    let realm = try! Realm()

    if let someClass = realm.objects(SomeClass.self).last {

        do {
            try realm.write({
                someClass.someList.append(someOtherClass)
            })
        } catch {
            print("something went wrong")
        }
    }
}

答案 1 :(得分:0)

我有一个非常相似的功能,允许用户从表格视图中进行选择。我所做的是从选择中创建一个List,如:

var arrayForSelectedObjects = [CustomObject]()
...

let aList = List<CustomObject>()
aList.append(objectsIn: arrayForSelectedObjects)

//I then assign the created list to the main object and save it.
let realmObject = MainObject()
realmObject.list = aList

我的CustomObject也存储在领域db。

My MainObject的定义如下:

class MainObject : Object {
    @objc dynamic var title: String?

    var list = List<CustomObject>()
}