【问题标题】:'self' used in property access 'questionNumber' before all stored properties are initialized (Combine)在初始化所有存储的属性之前,在属性访问“questionNumber”中使用“self”(组合)
【发布时间】:2020-05-17 10:39:32
【问题描述】:

我正在使用 SwiftSwiftUI 框架为 tvOS 开发一个测验应用程序。我有一个 QuestionBank 类和 Question 结构来设置我的问题,并且我创建了一个 QuizManager 类,它与使用 SwiftUI 编码的游戏视图交互。所以我将使用 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
    }

}

如您所见,我必须先初始化 questionNumber,然后才能使用它来初始化其他 @Published 变量。

【问题讨论】:

    标签: swift swiftui combine


    【解决方案1】:

    我自己发现,我不需要将 questionNumber 设置为 @Published 变量,但我需要重置 questionTextupdate() 函数中的 answers 值,以便 UI 在 @Published 变量更改时自行更新。

    这是最终代码:

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

    【讨论】:

      【解决方案2】:

      这是一个修复

      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
      }
      

      【讨论】:

      • 我自己刚刚找到了一个解决方案,但您的代码可能有效。感谢您的帮助?
      猜你喜欢
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      相关资源
      最近更新 更多