1. 숫자 배열 변환 시 compactMap vs map 차이
⚠️ 문제
let numberArray = number.map { $0.wholeNumberValue }
map은 변환 후 Optional을 포함한 배열을 반환한다.
✅ 해결
let numberArray = number.compactMap { $0.wholeNumberValue }
compactMap은 nil을 제거하고 실제 값만 추출한다.
- 유저 입력에서 숫자만 추출하려면
compactMap을 사용하는 것이 더 적합하다.
| 구문 | 결과 타입 | nil 처리 방식 |
|---|
map { $0.wholeNumberValue } | [Int?] (옵셔널 포함) | nil을 그대로 유지 |
compactMap { $0.wholeNumberValue } | [Int] (옵셔널 제거됨) | nil을 자동으로 제거 |
2. number.compactMap 중복 호출
⚠️ 문제
func checkInputNumber(_ number: String) -> Bool {
let numberList = number.compactMap { $0.wholeNumberValue }
return numberList.count == 3 && Set(numberList).count == 3 && numberList[0] != 0
}
func checkUserAnswer(userNumber: String, answer: [Int]) -> Bool {
var strikes = 0
var balls = 0
trialCount += 1
let userNumberList = userNumber.compactMap { $0.wholeNumberValue }
}
- 동일한 입력값에서 숫자 배열을 두 번 추출한다. → 중복 처리 발생
✅ 해결
let (isValid, userNumberArray) = checkInputNumber(userInput)
func checkInputNumber(_ number: String) -> (isOk: Bool, userNumberArray: [Int]) {
let numberArray = number.compactMap { $0.wholeNumberValue }
let isOk = numberArray.count == 3 && Set(numberArray).count == 3 && numberArray[0] != 0
return (isOk, numberArray)
}
func checkUserAnswer(userNumber: [Int], answer: [Int]) -> Bool {}
checkInputNumber 함수에서 숫자 배열도 함께 반환하도록 튜플 반환 구조 도입하여 해결
3. 맨 앞자리에 0이 오지 않도록 하기
⚠️ 문제
func makeAnswer() -> [Int] {
let selectNumbers = Array(0...9).shuffled().prefix(3)
return Array(selectNumbers)
}
0...9를 섞다 보니 012 같은 숫자 생성 가능
✅ 해결
func makeAnswer() -> [Int] {
let firstNumber = Int.random(in: 1...9)
let remainNumbers = Array(0...9).filter { $0 != firstNumber }.shuffled().prefix(2)
return [firstNumber] + Array(remainNumbers)
}
- 첫 숫자는
1~9 중에서 고정
- 나머지 두 숫자는
0~9(첫 숫자 제외) 중 중복 없이 섞어서 생성
4. 중복된 숫자 유효성 검사 코드 개선
⚠️ 문제
numberList[0] != numberList[1] && numberList[1] != numberList[2] && numberList[0] != numberList[2]
✅ 해결
Set(numberList).count == 3
💡 전체 코드
https://github.com/Pjh01/NumberBaseballGame