6. 퀴즈 앱

최종 모습

퀴즈풀기 앱

프로젝트로 배운 것

immutable 불변성, 구조체 선언과 사용, 리턴 함수 선언과 사용,
MVC 디자인 패턴 공부, 내부 매개변수와 외부 매개변수의 선언

구조체

struct Question {
    let text: String
    let answer: Array<Any>
    let correctAnswer: String
    init(q: String, a: Array<Any>,correctAnswer: String) {
        text = q
        answer = a
        self.correctAnswer = correctAnswer
    }
}

다른 언어들에서 사용하는 구조체와 비슷하다. 아니 같다. 하지만 앱을 구성하는데 구조체는 필히 익혀야 한다. MVC 디자인 패턴에서는 더더욱 필요한듯 보인다.

init은 생성자 역할을 한다, 따라서 선언을 한 후, 위와 같이 생성시 초기화를 돕는다.

사용

사용법은

var quizBrain = QuizBrain()

와 같이 사용할 수 있다.

리턴함수 선언과 사용

 func getQuestionText() -> String {
        return quiz[questionNumber].text
    }

위 코드와 같이 func으로 선언하고 -> 화살표를 이용해 리턴값을 지정해준다. 후에 리턴값을 동일하게 해주면 된다.

사용

사용법은

questionLabel.text = quizBrain.getQuestionText()

처럼 레이블을 갱신해줄때 사용한다.

내부 매개변수, 외부 매개변수,mutating

struct QuizBrain {
    var questionNumber = 0
    var scoreNumber = 0
    // _ 외부 매개변수 이름으로 저기에 user을 넣어서 사용할 수 있지만, 
    // 이름의 혼동을 막기 위해 _을 사용하면 그냥 넣어줄 변수의 이름만 넣으면 된다.
    mutating func checkAnswer(_ userChoice: String) -> Bool {
        if userChoice == quiz[questionNumber].correctAnswer {
            scoreNumber += 1
            return true
        } else {
            return false
        }
    }

먼저 매개변수 얘기를 하겠다.
매개변수는 함수 내에서 사용하기 위해 땡겨오는 느낌의 변수이다. 따라서 함수를 사용할때 같이 넣어주는 변수이다. 그런데 만일 매개변수의 이름이 너무 길거나 이름이 같을 경우, 혼란이 올 수 있다. 이를 막기 위해서 스위프트에서는 _ 표시를 통해 외부 매개변수는 이름 선언이 안되어있어도 입력 받을 수 있게 하고, 내부 매개변수는 원래 쓰던대로 사용할 수 있게 해줬다.

이게 무슨말이냐면

// 원래 선언
let userGotItRight = quizBrain.checkAnswer(userChoice: userAnswer)

// 외부 매개변수 사용시
let userGotItRight = quizBrain.checkAnswer(userAnswer)

와 같이 함수 외부에서 사용할때는 저렇게 생략이 가능하다. (외부 매개변수 이름을 _ 으로만 설정할 수 있는게 아니다. 다른 이름으로 사용해도 된다)

mutating

    // 같은 구조체에 위치하는 let 변수인 questionNumber를 같은 곳에서 수정하려고 하니 에러가 발생했다.
    // 따라서 이 변수를 변경 가능하게끔 만들기 위해선 mutating을 선언하면 된다.
    mutating func checkAnswer(_ userChoice: String) -> Bool {
        if userChoice == quiz[questionNumber].correctAnswer {
            scoreNumber += 1
            return true
        } else {
            return false
        }
    }

다시 위 코드를 보자. 함수를 선언한 코드 앞에 mutating이라는 키워드가 붙었다.
이 키워드는 구조체 내부에서 선언된 변수들을 수정할 수 있게 해주는 키워드이다.
mutating을 붙이지 않고 임의로 구조체 내의 변수를 수정하려 할경우, 엑스코드 자체에서 에러를 내뿜는다. 이는 구조체 내의 변수를 원래는 수정할 수 없게 설정해놓았기 때문이다. 따라서 mutating을 붙이고 수정할 수 있는 권한을 주는 것과 마찬가지다.

MVC 디자인 패턴

이미 다른 글로 정리를 해놨기에 실제로 앱에 적용한 모습으로 공부해보았다.

M(Model)


모델은 말 그대로 앱의 전체적인 데이터와 처리를 도맡아 하는 코드 부분이다. 퀴즈앱에서는 초기화를 돕는 Question 파일, 퀴즈 풀이, 카운트 등을 처리하는 QuizBrain 파일이 존재한다.

V(View)

뷰는 사용자 인터페이스를 관리하는 곳이다. 따라서 스토리보드가 위치해 있고, 사용자가 원하는 정보들을 시각적으로 보여주는 역할을 한다.

C(Controller)


컨트롤러는 사용자가 사용자 인터페이스에서 선택한 것들을 모델에게 부탁하여 처리하고, 처리한 정보들을 다시 뷰에게 보내는 역할을 해준다. 사실상 여기가 메인이다. 모델이 아무리 많은 정보를 가지고 있더라고 해도, 컨트롤러에서 제대로된 정보를 주지 않거나 막히면 앱은 충돌에 의해 중지된다. 앱의 최신정보를 업데이트 하고, 주로 정보를 업데이트하는 역할을 한다.

느낀점

MVC, 외부 매개변수, mutating등 이번에 만든 앱은 정말 많은것을 배운것 같다. 머리에 얼마나 남았을지는 의문이지만, 그래도 이제 이런 단순 뷰의 앱정도는 만들 수 있을 듯 하다! 점점 발전하는게 느껴져서 기분이 좋다. 더욱더 노력하자!

좋은 웹페이지 즐겨찾기