在初始化所有存储的属性(合并)之前,在属性访问“ questionNumber”中使用“ self”

时间:2020-05-17 10:39:32

标签: swift swiftui combine

我正在使用 Swift SwiftUI 框架为tvOS开发测验应用程序。我有一个 QuestionBank 类和 Question 结构来设置我的问题,我制作了一个 QuizManager 类,该类与用SwiftUI编码的游戏View交互。因此,我将使用 Combine 框架传递数据。

但是在QuizManager中,我想声明 @Published 变量时变得棘手,而其中一些变量需要另一个#Published变量来计算。确实,目前我有3个@Published变量:

  • questionNumber
  • questionText
  • 答案

这是我给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。

2 个答案:

答案 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
    }

}