【问题标题】:keep getting error 'value of type ' ' has no member ' '不断收到错误'类型''的值没有成员''
【发布时间】:2020-10-07 14:47:21
【问题描述】:

我在这个项目中被困了 2 天,我想我真的需要帮助。

程序只完成了一半,因为我什至无法让布局正常工作。我有一个 var settings = setting() 来链接到类 setting()。在课堂设置中,我有不同的变量和函数。

最初,我将类放在项目中的另一个 swift 文件中,但由于 Swift 不断给我“类型没有成员”错误,我决定将类放在 ContentView.swift 中。但即便如此,Swift 似乎在类实例中选择性地无法识别我的 var,我无法准确指出原因。

例如第一行错误“设置类型的值”没有成员“$playerChoice”表示它找不到 settings.playerChoice,而没有在下面的行中列出相同的错误以在字符串插值中查找 settings.playerChoice。我尝试关闭和打开程序,shift cmd K 重新编译预览几次,它没有工作。

谁能帮我看看到底出了什么问题?谢谢。

我的代码如下:

import SwiftUI
import Foundation

class setting {
    var playerChoice : Int = 0
    var questionCount : Int = 0

    var pcRandom : Int = 0
    var correctAnswer = 0
    var question : String = ""
    var buttonArray = [Int]()

    var enteredAnswer = ""
    var gameRound : Int = 0
    var scoreCount : Int = 0
    var title2 = ""

    var alertTitle = ""
    var alertMessage = ""
    var alertEndGame = false

    func refreshGame() {
        pcRandom = Int.random(in: 1 ... 12)
        correctAnswer = playerChoice * pcRandom
        question = "\(playerChoice) times \(pcRandom) is??"
    }

    func compareAnswer() {
        let answerModified = enteredAnswer
        let answerModified2 = answerModified.trimmingCharacters(in: .whitespacesAndNewlines)
        if Int(answerModified2) == correctAnswer {
            scoreCount += 1
            title2 = "RIGHT"
        }
        else {
            title2 = "WRONG"
        }

        if gameRound > questionCount {
            alertTitle = "Game Ended"
            alertMessage = "You got \(scoreCount) over \(questionCount)"
            alertEndGame = true
            }
        else {
            refreshGame()
        }
        gameRound += 1
        gameRound += 1
    }
}
var settings = setting()

struct ContentView: View {

    var body: some View {

        VStack {

            Section (header: Text("Getting Your Settings Righttt").font(.title)) {
                    Form {
                        Stepper(value: settings.$playerChoice, in: 1...13, step: 1) { //value of type 'setting' ha no member '$playerChoice'
                            if settings.playerChoice == 13 {Text("All")}
                            else {
                                Text("Multiplication table \(settings.playerChoice)")
                            }
                        }
                    }

                    Form {
                        Text("Number of Questions?")
                        Picker(selection: settings.$questionCount, label: Text("Number of Questions?")) { //value of type 'setting' has no member '$questionCount'
                        ForEach (settings.questionCountArray, id: \.self) {Text("\($0)")} } ////value of type 'setting' ha no member '$questionCountArray'
                            .pickerStyle(SegmentedPickerStyle())
                    }
                    Spacer()

                    Button("Tap to start") {
                        settings.refreshGame
                    }
            }

            Section (header: Text("Game Play").font(.title)){
                Text(settings.question)
                    TextField("Enter your answer", text: settings.$enteredAnswer, onCommit: settings.compareAnswer)   //value of type 'setting' ha no member '$enteredAnswer'
                    Text("Your score is currently \(settings.scoreCount)")
                    Text("This is game round \(settings.gameRound) out of \(settings.questionCount)")
                }
            Spacer()
            }
                .alert(isPresented: settings.$alertEndGame) {
                    Alert(title: Text("Game Ended"), message: Text("You reached score \(settings.scoreCount) out of \(settings.questionCount)"), dismissButton: .default(Text("Play Again"))) //game doesnt restart and refresh
                }
            }
        }

【问题讨论】:

  • 你不应该在变量名前加上 $。或者,如果你想使用绑定,那么你应该声明@State var playerChoice
  • 我需要 2 路绑定。如果我删除 $,它会出现另一个错误。我会更新这个,让你知道确切的错误是什么
  • 那么您忘记了对这些属性的@State 注释

标签: swift types member


【解决方案1】:

好吧,我没有检查逻辑,但下面的固定代码至少是可编译的,所以希望它会有所帮助

import SwiftUI
import Combine

class Setting: ObservableObject {
    @Published var playerChoice : Int = 0
    var questionCount : Int = 0
    @Published var questionCountArray = [String]()

    var pcRandom : Int = 0
    var correctAnswer = 0
    var question : String = ""
    var buttonArray = [Int]()

    @Published var enteredAnswer = ""
    var gameRound : Int = 0
    var scoreCount : Int = 0
    var title2 = ""

    var alertTitle = ""
    var alertMessage = ""
    @Published var alertEndGame = false

    func refreshGame() {
        pcRandom = Int.random(in: 1 ... 12)
        correctAnswer = playerChoice * pcRandom
        question = "\(playerChoice) times \(pcRandom) is??"
    }

    func compareAnswer() {
        let answerModified = enteredAnswer
        let answerModified2 = answerModified.trimmingCharacters(in: .whitespacesAndNewlines)
        if Int(answerModified2) == correctAnswer {
            scoreCount += 1
            title2 = "RIGHT"
        }
        else {
            title2 = "WRONG"
        }

        if gameRound > questionCount {
            alertTitle = "Game Ended"
            alertMessage = "You got \(scoreCount) over \(questionCount)"
            alertEndGame = true
            }
        else {
            refreshGame()
        }
        gameRound += 1
        gameRound += 1
    }
}

struct ASFContentView: View {
    @ObservedObject var settings = Setting()
    var body: some View {

        VStack {

            Section (header: Text("Getting Your Settings Righttt").font(.title)) {
                Form {
                    Stepper(value: $settings.playerChoice, in: 1...13, step: 1) { //value of type 'setting' ha no member '$playerChoice'
                        if settings.playerChoice == 13 {Text("All")}
                        else {
                            Text("Multiplication table \(settings.playerChoice)")
                        }
                    }
                }

                Form {
                    Text("Number of Questions?")
                    Picker(selection: $settings.questionCount, label: Text("Number of Questions?")) { //value of type 'setting' has no member '$questionCount'
                        ForEach (settings.questionCountArray, id: \.self) {Text("\($0)")} } ////value of type 'setting' ha no member '$questionCountArray'
                        .pickerStyle(SegmentedPickerStyle())
                }
                Spacer()

                Button("Tap to start") {
                    self.settings.refreshGame()
                }
            }

            Section (header: Text("Game Play").font(.title)){
                Text(settings.question)
                TextField("Enter your answer", text: $settings.enteredAnswer, onCommit: settings.compareAnswer)   //value of type 'setting' ha no member '$enteredAnswer'
                Text("Your score is currently \(settings.scoreCount)")
                Text("This is game round \(settings.gameRound) out of \(settings.questionCount)")
            }
            Spacer()
        }
        .alert(isPresented: $settings.alertEndGame) {
            Alert(title: Text("Game Ended"), message: Text("You reached score \(settings.scoreCount) out of \(settings.questionCount)"), dismissButton: .default(Text("Play Again"))) //game doesnt restart and refresh
        }
    }
}

【讨论】:

  • 非常感谢。我设法让它最终使用@Published 工作。我正在学习的课程并没有教会我这部分内容,而是希望我使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多