使用一个数组对象中的数据数组作为另一个数组对象的一部分
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)
}
}
假设 ExerciseModel
和 RoutineModel
是结构,
您可以使用完成闭包尝试这种方法。这个
保留您的两个模型并使用数据数组的内容
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 任务并发。
我有两个模型,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)
}
}
假设 ExerciseModel
和 RoutineModel
是结构,
您可以使用完成闭包尝试这种方法。这个
保留您的两个模型并使用数据数组的内容
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 任务并发。