Struct 활용하기
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를 쓰려면 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.green
UIColor.clear
모델과 뷰를 분리시킨 이유는?
컨트롤러(ViewController)와 뷰(Main.storyboard)는 그대로 둔채 모델만 변경시키면 앱을 변경할 수 있다.
자바로 mvc 모델을 만들었을 땐
컨트롤러에서 기능을 구현하고
모델에서는 쿼리문을 작성하고
뷰에서는 값을 뿌렸었는데
조금 다르다
viewController에 있는 IBOutlet을 조작하려면
function의 return값을 활용한다(functions with outputs)
파일에서 우클릭하고 New Group from Selection를 선택하면
폴더가 생성되고
폴더명을 Model, View, Controller로 바꾼다
//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)
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 복잡성
optional
skip...