Сохранение списка областей, состоящего из массива объектов структуры - PullRequest
0 голосов
/ 30 апреля 2018

Задача Мне нужно сохранить List в Realm, который состоит из свойств массива объектов Struct (который был передан через Segue и заполняет табличное представление). Это в форме «имени упражнения» и «количества повторений» в каждой строке.

Что я пробовал? Я сопоставил объект области со структурой в терминах полей и формата и попытался сохранить массив в виде списка, например, "= List ", но это не работает ("использование необъявленного типа"). Я также пробовал различные способы сохранить свойства каждой строки таблицы, но опять же не смог заставить это работать (например, = cell.workoutname)

Исследования Я нашел это Как сохранить структуру в царство в swift? однако, это не для сохранения массивов объектов, я не думаю. Однако это сделал (первый ответ), что дало мне идею потенциально сохранить значения, содержащиеся в каждой строке, в Realm вместо фактического массива Struct. Я также нашел это Сохранение массива в Realm в Swift? , но я думаю, что это для случая, когда массив уже состоит из объектов Realm, а не экземпляров Struct, как в моем случае.

Код и детали

1024 * Структуры *

У меня есть структура, как показано ниже. Другая структура (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
    }


}

У меня тогда есть следующие Объекты Царства. Один из них для сохранения «WorkoutSession». Он будет содержать список областей объектов области WorkoutExercise.

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
}

Я пробовал следующий код при попытке сохранить сведения о тренировке в области:

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

Что я думаю Мне нужно сделать, прочитав другие ответы

Опция 1 - вместо того, чтобы пытаться сохранить фактический массив, вместо этого сохраняйте 'name' и 'reps' из каждой строки таблицы?

Вариант 2 - каким-то образом преобразовать selectedWorkoutExerciseArray в список объектов области?

конечно, могут быть другие варианты! Любая помощь / идеи приветствуются!

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Зачем заполнять 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")
        }
    }
}
0 голосов
/ 30 апреля 2018

У меня очень похожая функциональность, которая позволяет пользователю выбирать из таблицы. Что я делаю, это создаю список из выбора, как:

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 также хранится в базе данных.

Мой MainObject определен так:

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

    var list = List<CustomObject>()
}
...