使用一个数组对象中的数据数组作为另一个数组对象的一部分

Using the data array from one array object as part of another array object

我有两个模型,ExerciseModel 和 RoutineModel,其中一个例程由一个或多个练习组成。我正在尝试使用 ExerciseArrayObject class 中的数据数组的内容作为我的 RoutineArrayObject 数据数组的一部分。

我收到以下错误:
'self' used in property access 'exercises' before all stored properties are initialized

这里是 ExerciseArrayObject:

import Foundation
import SwiftUI

class ExerciseArrayObject: ObservableObject {
    
    @Published var dataArray = [ExerciseModel]()
    
    init() {
        
        //print("FETCH FROM DATABASE HERE")
        
        let exercise1 = ExerciseModel(exerciseID: "", userID: "", username: "userA", exerciseTitle: "Exercise 1", dateCreate: Date(), exerciseImage: "logo", repsInfo: "12 reps", setsInfo: "3 sets")
        let exercise2 = ExerciseModel(exerciseID: "", userID: "", username: "userB", exerciseTitle: "Exercise 2", dateCreate: Date(), exerciseImage: "logo", repsInfo: "8 reps", setsInfo: "4 sets")
        let exercise3 = ExerciseModel(exerciseID: "", userID: "", username: "userC", exerciseTitle: "Exercise 3", dateCreate: Date(), exerciseImage: "logo", repsInfo: "5 reps", setsInfo: "5 sets")
        let exercise4 = ExerciseModel(exerciseID: "", userID: "", username: "userD", exerciseTitle: "Exercise 4", dateCreate: Date(), exerciseImage: "logo", repsInfo: "20 reps", setsInfo: "10 sets")
        let exercise5 = ExerciseModel(exerciseID: "", userID: "", username: "userE", exerciseTitle: "Exercise 5", dateCreate: Date(), exerciseImage: "logo", repsInfo: "10 reps", setsInfo: "3 sets", sharedUserUsername: "Shared User")
        
        self.dataArray.append(exercise1)
        self.dataArray.append(exercise2)
        self.dataArray.append(exercise3)
        self.dataArray.append(exercise4)
        self.dataArray.append(exercise5)
    }
    
}

这里是 RoutineArrayObject:

class RoutineArrayObject: ObservableObject {
    
    @ObservedObject var exercises: ExerciseArrayObject
    @Published var dataArray = [RoutineModel]()
    
    init() {
        
        //print("FETCH FROM DATABASE HERE")
        
        let routine1 = RoutineModel(routineID: "", userID: "", username: "user1", routineTitle: "Yoga Routine", exercises: exercises.dataArray, dateCreate: Date(), routineImage: "demoexercise", noOfExercises: "\(exercises.dataArray.count)")
        
        let routine2 = RoutineModel(routineID: "", userID: "", username: "user2", routineTitle: "Core Routine", exercises: exercises.dataArray, dateCreate: Date(), routineImage: "logo", noOfExercises: "\(exercises.dataArray.count)", sharedUserID: "", sharedUserUsername: "Shared User")
        
        self.dataArray.append(routine1)
        self.dataArray.append(routine2)
        
    }
    
}

假设 ExerciseModelRoutineModel 是结构, 您可以使用完成闭包尝试这种方法。这个 保留您的两个模型并使用数据数组的内容 ExerciseArrayObject class 作为 RoutineArrayObject 数据数组的一部分。

class ExerciseArrayObject: ObservableObject {
    
    @Published var dataArray = [ExerciseModel]()
    
    init() {
        ExerciseArrayObject.fetchExcersices() { arr in
            self.dataArray = arr
        }
    }
    
    static func fetchExcersices(completion: @escaping([ExerciseModel]) -> ()) {
        
        //print("FETCH FROM DATABASE HERE")
        var excersices = [ExerciseModel]()
        
        let exercise1 = ExerciseModel(exerciseID: "", userID: "", username: "userA", exerciseTitle: "Exercise 1", dateCreate: Date(), exerciseImage: "logo", repsInfo: "12 reps", setsInfo: "3 sets")
        let exercise2 = ExerciseModel(exerciseID: "", userID: "", username: "userB", exerciseTitle: "Exercise 2", dateCreate: Date(), exerciseImage: "logo", repsInfo: "8 reps", setsInfo: "4 sets")
        let exercise3 = ExerciseModel(exerciseID: "", userID: "", username: "userC", exerciseTitle: "Exercise 3", dateCreate: Date(), exerciseImage: "logo", repsInfo: "5 reps", setsInfo: "5 sets")
        let exercise4 = ExerciseModel(exerciseID: "", userID: "", username: "userD", exerciseTitle: "Exercise 4", dateCreate: Date(), exerciseImage: "logo", repsInfo: "20 reps", setsInfo: "10 sets")
        let exercise5 = ExerciseModel(exerciseID: "", userID: "", username: "userE", exerciseTitle: "Exercise 5", dateCreate: Date(), exerciseImage: "logo", repsInfo: "10 reps", setsInfo: "3 sets", sharedUserUsername: "Shared User")
        
        excersices.append(exercise1)
        excersices.append(exercise2)
        excersices.append(exercise3)
        excersices.append(exercise4)
        excersices.append(exercise5)
        
        completion(excersices)  // <-- todo deal with errors etc...
    }
    
}

class RoutineArrayObject: ObservableObject {

    @Published var dataArray = [RoutineModel]()
    
    init() {
        ExerciseArrayObject.fetchExcersices() { exercises in
            print("--> exerciseArray: \(exercises)")
            self.fetchRoutines(exercises: exercises) { _ in
                print("--> routineArray: \(self.dataArray)")
            }
        }
    }

    func fetchRoutines(exercises: [ExerciseModel], completion: @escaping(Bool) -> ()) {
        //print("FETCH FROM DATABASE HERE")
        
        let routine1 = RoutineModel(routineID: "", userID: "", username: "user1", routineTitle: "Yoga Routine", exercises: exercises, dateCreate: Date(), routineImage: "demoexercise", noOfExercises: exercises.count)
        
        let routine2 = RoutineModel(routineID: "", userID: "", username: "user2", routineTitle: "Core Routine", exercises: exercises, dateCreate: Date(), routineImage: "logo", noOfExercises: exercises.count, sharedUserID: "", sharedUserUsername: "Shared User")
        
        self.dataArray.append(routine1)
        self.dataArray.append(routine2)
        
        completion(true)  // <-- todo deal with errors etc...
    }
    
}

您还可以使用其他技术来代替基本的完成闭包,例如 async/await 任务并发。