[問題アプリケーション1]構造体


今回作成するクイズソフトで質問があれば、TrueやFalseの質問に答えることができます.質問と回答を2 D配列と構造体として表現します.

ソースコードを使用してStoryboardのラベルとボタンを接続します。(Ctrl + Drag & Drop) (IBOutlet)

    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var ProgressBar: UIProgressView!
    @IBOutlet weak var trueButton: UIButton!
    @IBOutlet weak var falseButton: UIButton!

IBACTIONを追加してすべてのtrueボタンfalseボタンを接続


//答えを入力すると、この関数が機能します.
    @IBAction func answerButtonPressed(_ sender: UIButton) {   
    }

問題配列を作成しoverride関数で問題番号を割り当てて更新する


import UIKit

class ViewController: UIViewController {
    
    
    
    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var ProgressBar: UIProgressView!
    @IBOutlet weak var trueButton: UIButton!
    @IBOutlet weak var falseButton: UIButton!
    
    let quiz = [
        "Four + Two is equal to Six",
        "Five - Three is Greater than One",
        "Three + Eight is less than Ten"
    
    ]
    
    var questionNumber = 0 // 문제번호 초기화
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        updateUI() // updateUI()함수 호출
    }

    
    @IBAction func answerButtonPressed(_ sender: UIButton) {
    // 문제번호를 하나씩 늘려간다
        questionNumber += 1
        updateUI()
    }
    
    func updateUI() { // 문제번호를 업데이트 하는 함수
        questionLabel.text = quiz[questionNumber]
    }
}
ここまで言うと、二つの問題があります.
1.答えはスキップしやすく、間違えたときに間違える
2.インデックスが範囲外でエラーが発生しました.
これらの問題を解決するには

2 D配列を使用して評価

  • 質問と答え2次元配列
  •   let quiz = [
              ["Four + Two is equal to Six","True"],
              ["Five - Three is Greater than One","True"],
              ["Three + Eight is less than Ten", "False"]
          ] // 2D Array
  • 採点ユーザ回答
    ユーザが「真」ボタンまたは「偽」ボタンを押すと、スコアが必要になるため、answerButtonPressed関数を実行する必要があります.
  •     @IBAction func answerButtonPressed(_ sender: UIButton) {
            
            let userAnswer = sender.currentTitle
            // 사용자의 답에 currentTitle의 sender 값을 넣는다 (True, False)
            
            
            let actualAnswer = quiz[questionNumber][1] // 실제 답
            
            // 사용자가 입력한 답 채점
            if userAnswer == actualAnswer{ // 답이 맞으면 
                print("Right!")
            } else { // 틀린 경우 
                print("Wrong!")
            }
            
            // 문제번호를 하나씩 늘려간다
            if questionNumber + 1 < quiz.count {
            // out of range index 오류를 해결하기 위해 +1 해준 것 
                questionNumber += 1
                
            }
            updateUI()
        }
  • 問題が終了していないときに繰り返し続けるには、次の手順に従います.
    繰り返すべきだと思いますので、while true{ ... }の無限ループを使いたいと思っていましたが、私が思ったように実行そのものにはなりませんでした.しかし、簡単にするために
  •         if questionNumber + 1 < quiz.count {
                questionNumber += 1
                
            } else {
                questionNumber = 0 
            }
    else条件ですべて解題した場合、インデックスを0に設定して戻ります.

    配列ではなく構造体を使用する

    file-new file-swift file選択-名前の設定(ここではQuestion)-Createカテゴリに新しいQuestionメニューが作成されます.
  • 構造の作成
  • import Foundation
    
    struct Question {
        let text: String
        let answer: String
        
        init(q: String, a: String){
          text = q
          answer = a
        }
    }
  • ViewControllerに戻り、2次元配列の代わりにstructを使用します.
  •     let quiz = [
            Question(q: "Four + Two is equal to Six", a: "True"),
            Question(q: "Five - Three is Greater than One", a: "True"),
            Question(q: "Three + Eight is less than Ten", a: "False")
        ]
  • IBACTION関数で使用される配列も、構造体属性に置き換えられます.
  •     @IBAction func answerButtonPressed(_ sender: UIButton) {
            
            let userAnswer = sender.currentTitle 
            let actualAnswer =  quiz[questionNumber].answer 
            // 인덱스 대신 구조체 property를 사용함으로써 훨씬 보기가 편해졌다. 나는 답! 
            
            if userAnswer == actualAnswer{
                print("Right!")
            } else {
                print("Wrong!")
            }
            
            if questionNumber + 1 < quiz.count {
                questionNumber += 1
                
            } else {
                questionNumber = 0
            }
            updateUI()
        }
        
        func updateUI() { 
            questionLabel.text = quiz[questionNumber].text
    	// 나는 문제! 
        }

    これまでの成果



    評価結果はコンソールウィンドウでのみ表示されます.ユーザーに採点結果を見せるために、勉強を続けるつもりです.