Swift / как получить увеличение на единицу каждый раз, когда пользователь получает правильный ответ? - PullRequest
1 голос
/ 09 мая 2020

Я новичок в Swift. В настоящее время я изучаю модуль структуры.

Меня попросили создать оценку, которая увеличивается на 1 балл каждый раз, когда пользователь получает правильный ответ, но моя оценка в конечном итоге увеличивается на 2. Я так сбита с толку. В остальном все нормально. Кто-нибудь может мне помочь?

Мой код ниже:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var questionLable: UILabel!
    @IBOutlet weak var progressBar: UIProgressView!
    @IBOutlet weak var trueButton: UIButton!
    @IBOutlet weak var falseButton: UIButton!
    @IBOutlet weak var scoreLabel: UILabel!

    var quizBrain = QuizBrain()


    override func viewDidLoad() {
        super.viewDidLoad()
        progressBar.progress = 0
        updatedUI()
    }


    @IBAction func answerButtonPressed(_ sender: UIButton) {

        let userAnswer = sender.currentTitle!        
        let userGotItRight = quizBrain.checkAnswer(userAnswer) 

        print(quizBrain.checkAnswer(userAnswer))
        if userGotItRight{              

            UIView.animate(withDuration: 0.2) {
                sender.backgroundColor = #colorLiteral(red: 0.4745098054, green: 0.8392156959, blue: 0.9764705896, alpha: 1)
            }
            UIView.animate(withDuration: 0.2) {
                sender.backgroundColor = UIColor.clear
            }
        }else{
            UIView.animate(withDuration: 0.2) {
                sender.backgroundColor = #colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1)
            }
            UIView.animate(withDuration: 0.2) {
                sender.backgroundColor = UIColor.clear
            }
        }

        quizBrain.nextQuestion()
        updatedUI()
    }

    func updatedUI()  {
        questionLable.text = quizBrain.getQuestionText()
        scoreLabel.text = "Score:\(quizBrain.getScore())"
        progressBar.progress = quizBrain.getProgress()

    }
}

Следующая часть - Модель:

import Foundation

struct QuizBrain {
    let quiz = [

        Question(q: "A slug's blood is green.", a: "True"),
        Question(q: "Approximately one quarter of human bones are in the feet.", a: "True"),
        Question(q: "The total surface area of two human lungs is approximately 70 square metres.", a: "True"),
        Question(q: "Chocolate affects a dog's heart and nervous system; a few ounces are enough to kill a small dog.", a: "True")

    ]
    var questionNumber = 0
    var score = 0

    mutating func checkAnswer(_ userAnswer: String) -> Bool {
        if userAnswer == quiz[questionNumber].answer{     
            score += 1
            return true                 
        }else{
            return false
        }

    }
   mutating func getScore() -> Int {
        return score
    }
    func getQuestionText() -> String {

        return quiz[questionNumber].text     
    }
    func getProgress() -> Float {
        let progress = Float(questionNumber + 1)/Float(quiz.count)
        return progress
    }
    mutating func nextQuestion(){
        if questionNumber + 1 < quiz.count{           
           questionNumber += 1       
        }else {
            questionNumber = 0
            score = 0
        }
    }

}

1 Ответ

2 голосов
/ 09 мая 2020

Ваша проблема заключается в этих двух строках:

   let userGotItRight = quizBrain.checkAnswer(userAnswer) 

    print(quizBrain.checkAnswer(userAnswer))

В первой строке вы проверяете ответ, чтобы узнать, правда ли он. Если true, он увеличивается на единицу, но в следующей строке вы хотите просто распечатать результат, но на самом деле вы снова вызываете checkAnswer, который увеличивает его еще раз.

Возможно, вы могли бы изменить две строки чтобы выглядеть так:

let userGotItRight = quizBrain.checkAnswer(userAnswer) 
print(userGotItRight)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...