포스트

Quizzler (1)

앱을 키자마자 위와 같이 문제가 나오게 해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var progresBar: UIProgressView!
    @IBOutlet weak var trueButton: UIButton!
    @IBOutlet weak var falseButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        questionLabel.text = "Four+Two is equal to Six"
    }

    @IBAction func answerButtonPressed(_ sender: UIButton) {
    }
    
}

간단하다.

1
2
3
4
5
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        questionLabel.text = "Four+Two is equal to Six"
    }

viewDidLoad()는 앱을 실행하자마자 작동을 하는 함수이므로 거기에 위와 같이 questionLabel에 관한 내용을 적어주면 된다.

이번엔 위와 같이 퀴즈에 관한 문제가 배열로 주어졌다

이것의 첫번째 index에 관한 문제를 띄워보자. 이정도는 뭐 가볍게 끝내자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var progresBar: 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.
        questionLabel.text = quiz[questionNumber]
    }
    
    @IBAction func answerButtonPressed(_ sender: UIButton) {
        questionNumber += 1
        
    }
    
}


위와 같이 버튼을 눌렀을때 문제가 바뀌도록 해보았다. 하지만 아무리 눌러도 변화가없다.


Q : 왜일까? 분명히 questionNumber라는 변수를 선언하였고, 버튼을 누를때마다 1씩 증가하게 했으면 배열의 인덱스가 1씩 늘어나므로 label에는 증가한 인덱스에 해당하는 문장이 나와야하는데 왜 안나올까?

A : 현재 label에 관한 코드가 어느 위치에 있는지 확인을 해보자

1
2
3
4
override func viewDidLoad() {
        super.viewDidLoad()
        questionLabel.text = quiz[questionNumber]
    }

해당 코드가 다시 트리거가 되어야하는데. viewdidload는 앱실행후 한번만 트리거가 되기 때문이다.

즉 현재는 다시 트리거해줄 수 있는것이 없다.


그래서 label을 재 트리거 해줄 함수를 새로 만들자.

그러면 이제는 잘된다.

하지만 문제가 3개밖에 없기에 3번째 누르는 순간 에러가 발생한다.

왜냐면 questionNumber는 누를때마다 1씩 증가하는데, 배열안에 index는 2가 끝이기 때문이다.

에러가났을때 바로 console쪽의 arrow를 통해 value를 볼 수 있다.

에러가 났을때의 questionNumber 는 3이다.

하지만 배열의 index는 0부터 시작하고 안에 3문장만 있으므로 0, 1, 2가 끝이다.

그런데 해당 배열의 index=3에 해당하는 값을 가져오려고하니 에러가 발생한 것이다.


이번엔 해당 문제에 관해 True or False인지를 부여해보자.

현재의 quiz배열은 1차원이다.

위의 image처럼 2차원 배열을 이용해 만들어 보자. 바뀌었다.

그럼 전에는 어떻게 되어있었을까?

코드 작성을 통해 무한 반복되게 하면서 에러가 발생하지 않게 하였다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var progresBar: UIProgressView!
    @IBOutlet weak var trueButton: UIButton!
    @IBOutlet weak var falseButton: UIButton!
    
    let quiz = [
        ["Four + Two is equal to Six.", "True"],
        ["Five - Three is greater than One.", "True"],
        ["Three + Eight is less than Ten.", "False"]
    ]

    var questionNumber = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        updateUI()
       
    }
    
    @IBAction func answerButtonPressed(_ sender: UIButton) {
        
        let userAnswer = sender.currentTitle // true or false
        let actualAnswer = quiz[questionNumber][1]
        
        if userAnswer == actualAnswer {
            print("Right!")
        } else {
            print("Wrong!")
        }
        
//        if questionNumber == 2 {
//            questionNumber = 0
//        }
//        
//        questionNumber += 1
        
        if questionNumber + 1 < quiz.count {
            questionNumber += 1
        } else {
            questionNumber = 0
        }
        
        updateUI()
        
        
        
    }
    
    func updateUI() {
        questionLabel.text = quiz[questionNumber][0]
    }
    
}

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.