전체 프로젝트 내용 중,
레벨 2 도전 ..
#1) if문을 사용한 코드
struct BaseballGame {
func start() {
let answer = makeAnswer() // 정답을 만드는 함수 호출
while true {
print("세 자리 숫자를 입력하세요:", terminator: " ") // 유저에게 입력값을 받는 안내 메시지 출력
if let input = readLine() {
if let number = Int(input) {
if input.count == 3 {
let digits = String(number).compactMap { Int(String($0)) } // 입력값을 각 자리 숫자로 분리하여 배열로 저장
if digits.count == 3, Set(digits).count == 3 {
var strike = 0
var ball = 0
for (index, digit) in digits.enumerated() { // 입력값과 정답을 비교하여 스트라이크와 볼 계산
if digit == answer[index] {
strike += 1
} else if answer.contains(digit) {
ball += 1
}
}
if strike == 3 { // 정답일 경우 게임 종료
print("정답입니다!")
break
} else {
print("\(strike)스트라이크 \(ball)볼") // 스트라이크와 볼 출력
}
} else {
print("올바르지 않은 입력값입니다.")
}
} else {
print("세 자리 숫자를 입력하세요.")
}
} else {
print("유효하지 않은 입력입니다.")
}
}
}
}
private func makeAnswer() -> [Int] {
var digits = [Int]()
while digits.count < 3 {
let digit = Int.random(in: 1...9) // 1부터 9까지의 난수 생성
if !digits.contains(digit) { // 중복된 숫자가 없을 때만 추가
digits.append(digit)
}
}
return digits
}
}
let game = BaseballGame()
game.start()
#2) guard 문을 사용한 경우
struct BaseballGame {
func start() {
let answer = makeAnswer() // 정답을 만드는 함수 호출
while true {
print("세 자리 숫자를 입력하세요:", terminator: " ") // 유저에게 입력값을 받는 안내 메시지 출력
guard let input = readLine() else { // 입력값이 nil인 경우 반복문 처음으로 돌아가기
continue
}
guard let number = Int(input) else { // 정수로 변환되지 않는 경우 반복문 처음으로 돌아가기
print("유효하지 않은 입력입니다.")
continue
}
guard input.count == 3 else { // 세 자리가 아닌 경우 반복문 처음으로 돌아가기
print("세 자리 숫자를 입력하세요.")
continue
}
let digits = String(number).compactMap { Int(String($0)) } // 입력값을 각 자리 숫자로 분리하여 배열로 저장
guard digits.count == 3, Set(digits).count == 3 else { // 숫자가 세 개가 아니거나, 중복된 숫자가 있는 경우 반복문 처음으로 돌아가기
print("올바르지 않은 입력값입니다.")
continue
}
var strike = 0
var ball = 0
for (index, digit) in digits.enumerated() { // 입력값과 정답을 비교하여 스트라이크와 볼 계산
if digit == answer[index] {
strike += 1
} else if answer.contains(digit) {
ball += 1
}
}
if strike == 3 { // 정답일 경우 게임 종료
print("정답입니다!")
break
} else {
print("\(strike)스트라이크 \(ball)볼") // 스트라이크와 볼 출력
}
}
}
private func makeAnswer() -> [Int] {
var digits = [Int]()
while digits.count < 3 {
let digit = Int.random(in: 1...9) // 1부터 9까지의 난수 생성
if !digits.contains(digit) { // 중복된 숫자가 없을 때만 추가
digits.append(digit)
}
}
return digits
}
}
let game = BaseballGame()
game.start()
guard 문은 주어진 조건이 false일 경우, 해당 블록 내에서 실행되며, 일반적으로 오류 처리 및 예외 상황을 다룰 때 사용된다.
BaseballGame struct의 start() 메서드에서 guard 문은 입력값의 유효성을 검사하고, 유효하지 않을 경우 다음 반복으로 넘어간다.
#1.
guard let input = readLine() else { continue }: readLine() 함수를 통해 유저의 입력을 받는다. 만약 입력값이 nil이라면, 즉 유저가 아무 입력도 하지 않았거나 입력을 받을 수 없는 상황이라면 continue를 통해 반복문의 처음으로 돌아간다.
#2.
guard let number = Int(input) else { print("유효하지 않은 입력입니다."); continue }: 입력값을 정수로 변환한다. 변환에 실패하면 nil이 반환되므로, 유효하지 않은 입력이라고 판단하고 오류 메시지를 출력한 뒤 continue를 통해 반복문의 처음으로 돌아간다.
#3.
guard input.count == 3 else { print("세 자리 숫자를 입력하세요."); continue }: 입력값의 길이가 3이 아니라면, 즉 세 자리 숫자가 아니라면 오류 메시지를 출력하고 continue를 통해 반복문의 처음으로 돌아간다.
#4.
guard digits.count == 3, Set(digits).count == 3 else { print("올바르지 않은 입력값입니다."); continue }: 입력값을 각 자리 숫자로 분리한 digits 배열의 길이가 3이 아니거나, 중복된 숫자가 있는 경우 오류 메시지를 출력하고 continue를 통해 반복문의 처음으로 돌아간다.
'iOS 앱 개발자 프로젝트 > 개인 프로젝트' 카테고리의 다른 글
[iOS] 메모 앱 만들기 " Let's start !" (2) | 2024.03.20 |
---|---|
[Project] 숫자 야구 게임 만들기 (Lv3) (0) | 2024.03.12 |
[Project] 숫자 야구 게임 만들기 (Lv1) (0) | 2024.03.12 |
[Project] 숫자 야구 게임 만들기(Lv1-6) (0) | 2024.03.11 |
[Project] #4 나만의 계산기 만들기(Lv3) (2) | 2024.03.07 |