섹션9: MVC 패턴, Struct, mutating, 퀴즈 앱 만들기(복습)

인생노잼시기·2021년 2월 3일
0

📱Udemy iOS

목록 보기
4/20

Struct 활용하기

Quizzler Project

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", "True"],
        ["Five", "True"],
        ["Six", "False"]
    ]
    
    var questionNumber = 0
    
    override func viewDidLoad() {
        updateUI()
        //viewDidLoad는 한번만 실행되기 때문에
        //버튼을 누를 때마다 UI를 업데이트하기 위해 함수로 만들고
        //IBAction에서도 호출
    }

    @IBAction func answerButtonPressed(_ sender: UIButton) {
        
        let userAnswer = sender.currentTitle
        let actualAnswer = quiz[questionNumber][1]
        
        if userAnswer == actualAnswer {
            print("Right")
        } else {
            print("Wrong")
        }
        
        if questionNumber + 1 < quiz.count {    //questionNumber + 1을 먼저 비교해서 count보다 커지지 않도록 한다
            questionNumber += 1
        } else {
            questionNumber = 0
        }
        
        updateUI()
    }
    
    func updateUI() {
        questionLabel.text = quiz[questionNumber][0]
    }
}

Struct 구조체, 기본 데이터 타입이 아니며 사용자 지정 타입, blue print

struct를 쓰려면 initialize해야한다 init() ex) Town()
목적: 블루프린트같은 struct를 복사해서 쓰려고
struct에 선언된 변수는 property라고 불리고
struct에 선언된 함수는 method라고 불린다

struct로 New File 스위프트 파일을 만들 때에는
struct이름과 파일명을 동일하게 해야한다

import Swift

struct Town {
    let name: String
    var citizens: [String]
    var resources: [String: Int]

    init(name: String, people: [String], stats: [String: Int]) {
        self.name = name
        citizens = people
        resources = stats
    }

    func fortify() {    // method (struct안에 들어있어서)
        print("Defences increased")
    }
}

var anotherTown = Town(name: "Nameless Island", people: ["Tom"], stats: ["Coconuts": 100])
anotherTown.citizens.append("Wilson")
print(anotherTown.citizens)

var ghostTown = Town(name: "Ghosty Island", people: [], stats: ["Tumbleweed": 100])
ghostTown.fortify()

프로젝트 폴더 하위에 Question.swift파일을 만들고

import Foundation

struct Question {
	let text: String
    let answer: String
    
    init(q: String, a: String) {
    	self.text = q
        self.answer = a
    }
}

ViewController.swift에서 아래와 같이 사용 가능하다

let quiz = [
	Question(q: "question0", a: "True"),
    Question(q: "question1", a: "True")
]

UIColor 기본적으로 설정되어 있는 색상 팔레트

UIColor.green
UIColor.clear

MVC Design Pattern

모델과 뷰를 분리시킨 이유는?
컨트롤러(ViewController)와 뷰(Main.storyboard)는 그대로 둔채 모델만 변경시키면 앱을 변경할 수 있다.

자바로 mvc 모델을 만들었을 땐
컨트롤러에서 기능을 구현하고
모델에서는 쿼리문을 작성하고
뷰에서는 값을 뿌렸었는데

조금 다르다

  • 그 외의 패턴 예시
    • VIPER
    • MVVM

viewController에 있는 IBOutlet을 조작하려면
function의 return값을 활용한다(functions with outputs)

New Group from Selection

파일에서 우클릭하고 New Group from Selection를 선택하면
폴더가 생성되고
폴더명을 Model, View, Controller로 바꾼다

parameter

  • external parameter
  • internal parameter
//external parameter name: answer
//internal parameter name:  userAnswer
func checkAnswer(answer userAnswer: String) {	
	print(userAnswer)
}
//external parameter 생략
func checkAnswer(_ userAnswer: String) {	// _만 써있으면 argument만 입력하면 된다
	print(userAnswer)
}

checkAnswer(123)

immutable 변경불가성

  • let keyword

  • old copy를 destroy하고 new copy를 만들어야 한다

  • struct 변경하기

    • outside

    • inside 안에서 변경할 때
      'self' is immutable 오류가 발생하는데
      name = "Reeves"은 사실 self.name = "Reeves"와 동일하기 때문이다.
      (let과 동일한 효과를 가진다)

      mutating을 붙여주면 self.name이 var name처럼 작동해 상태를 변경할 수 있다.

      mutating func harvestRice() {
      	resources["Rice"] = 100
      }

디자인패턴이란?

문제를 해결하기 위한 수단
문제는? Complexity 복잡성

개발 영단어

  • generic: to keep my town very generic, 데이터 타입을 일반화한다
    let name = "Angeland" -> let name
  • immutability: 변경 ㅂㄹ가성

영단어

  • peculiar 독특한
  • mayhem: 대혼란
  • pedantic: 조그만 것에 주의를 기울이다
  • conform: 순응하다
  • encompass: 포함하다

multiple choice quiz

optional
skip...

profile
인생노잼

0개의 댓글