【问题标题】:Using the data array from one array object as part of another array object使用来自一个数组对象的数据数组作为另一个数组对象的一部分
【发布时间】:2022-01-02 10:10:39
【问题描述】:

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

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

这是练习数组对象:

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)
        
    }
    
}

【问题讨论】:

  • 您可以将 init 中的代码添加到单独的函数中,然后从 .onAppear 中的视图调用该函数
  • 或者将两个类合并为一个。
  • 你不应该在 RoutineArrayObject 中使用 @ObservedObject var exercises: ExerciseArrayObject@ObservedObject 用于视图,而不是类。

标签: arrays swift mvvm swiftui model


【解决方案1】:

假设ExerciseModelRoutineModel 是结构体, 您可以使用完成闭包尝试这种方法。这 保留您的两个模型并使用数据数组的内容 ExerciseArrayObject 类作为 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 与任务并发。

【讨论】:

  • 谢谢,这对我有用,我明白你在做什么。不过,我可能不得不去更详细地了解什么是完成闭包,因为我在那里有点困惑。
  • 注意,我的回答只是一种方法的一些快速代码,有很多方法可以实现你想要的。如果您要从服务器获取数据,那么您绝对应该对闭包有一个很好的了解。
猜你喜欢
  • 2021-05-14
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多