我正在使用 Swift 和 SwiftUI 框架为tvOS开发测验应用程序。我有一个 QuestionBank 类和 Question 结构来设置我的问题,我制作了一个 QuizManager 类,该类与用SwiftUI编码的游戏View交互。因此,我将使用 Combine 框架传递数据。
但是在QuizManager中,我想声明 @Published 变量时变得棘手,而其中一些变量需要另一个#Published变量来计算。确实,目前我有3个@Published变量:
这是我给QuizManager的代码:
import Combine
import Foundation
class QuizManager: ObservableObject {
var questionBank: QuestionBank
@Published var questionNumber = 0
@Published var questionText: String
@Published var answers: [String]
func updateQuestion() {
self.questionNumber += 1
}
init() {
self.questionNumber = 0
self.questionBank = QuestionBank()
self.questionText = questionBank.questions[questionNumber].questionText
self.answers = questionBank.questions[questionNumber].answers
}
}
如您所见,在使用它来初始化其他@Published变量之前,我必须先初始化questionNumber。
答案 0 :(得分:0)
这是个解决方法
init() {
let questionNumber = 0 // use local tmp var
self.questionNumber = questionNumber
self.questionBank = QuestionBank()
self.questionText = questionBank.questions[questionNumber].questionText
self.answers = questionBank.questions[questionNumber].answers
}
答案 1 :(得分:0)
我发现自己不需要将 questionNumber 设置为 @Published 变量,但是我需要重设 questionText 和 update()函数中的 answers 值,以便在 @Published 变量更改时UI会自动更新。
这是最终代码:
class QuizManager: ObservableObject {
var questionBank: QuestionBank
var questionNumber: Int
@Published var questionText: String
@Published var answers: [String]
func updateQuestion() {
self.questionNumber += 1
self.questionText = questionBank.questions[questionNumber].questionText
self.answers = questionBank.questions[questionNumber].answers
}
init() {
self.questionNumber = 0
self.questionBank = QuestionBank()
self.questionText = questionBank.questions[questionNumber].questionText
self.answers = questionBank.questions[questionNumber].answers
}
}