100 Days of SwiftUI - Day 31
Project 5에 관한 퀴즈를 풀고 챌린지 3문제를 해결한다.
Challenge
- 세글자보다 짧거나, 루트 단어와 같은 단어는 허용하지 않는다.
- 사용자가 원하는 경우 게임을 다시 시작할 수 있도록
startGame()
을 호출하는 툴바를 추가한다. - 루트 단어에서 새로운 단어를 만드는 경우 점수를 추가하기.
Challenge - 문제풀이
1번
세글자보다 짧은지 확인하는 함수와 시작 단어와 같은지 확인하는 함수를 따로 작성했다.
두 함수들은 addNewWord()
함수에서 호출했다.
// 3글자 이상인지 체크
func isValidLength(word: String) -> Bool {
(word.count >= 3)
}
// 시작 단어와 다른 단어인지 체크
func isSame(word: String) -> Bool {
!(rootWord == word)
}
호출부분
func addNewWord() {
//입력값을 소문자로 변환하고 앞뒤 공백을 자른다.
let answer = newWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
// 3자 이상인지 체크
guard isValidLength(word: answer) else {
wordError(title: "Word too short", message: "3글자 이상")
return
}
// 처음 제공된 단어와 같은 단어인지 체크
guard isSame(word: answer) else {
wordError(title: "Word is same", message: "처음 제공된 단어와 같은 단어입니다")
return
}
...
}
2번
List
의 NavigationTitle
수정자 밑에 toolbar
수정자를 추가하고 그 안에 Button
뷰를 배치했다. Button
은 눌러질 때마다 startGame()
함수를 호출한다.
List {
// 내용들
}
.navigationTitle(rootWord)
.toolbar {
Button("Reset") {
startGame()
}
}
3번
점수를 저장하는 프로퍼티인 score
를 추가하고, 답안의 글자 수 * 10으로 점수를 추가하는 함수addScore
를 정의했다.
addScore
는 addNewWord
함수에서 단어를 리스트에 추가하고 newWord
변수를 초기화하는 부분 사이에서 호출했다.
struct contentView: View {
@State private var score = 0 //점수를 기록
...
}
func addNewWord() {
...
withAnimation {
usedWords.insert(answer, at: 0)
}
// 점수를 추가
addScore(word: answer)
// 새로 입력할 단어를 초기화
newWord = ""
}
func addScore(word: String) {
score += word.count * 10
}
게임을 다시 시작할 때 점수도 초기화하기 위해 startGame()
안에 score = 0
를 추가했다.