반응형
Swift wholeNumberValue 사용 시 숫자가 아닌 문자 포함 이슈 해결
문제 상황
Swift의 Character.wholeNumberValue를 사용하면 숫자가 아닌 문자가 포함된 입력도 변환되는 문제 발생
wholeNumberValue는 Int? 타입을 반환하면서 문자가 포함된 입력에서도 숫자만 걸러지는 문제가 있음.
예를 들어, input = "1ㅁ23"인 경우 **[1, 2, 3]**으로 변환되어 입력이 허용됨.
사용자 의도와 다르게 잘못된 입력을 허용하는 보안 취약점 가능성이 있음.
문제 코드
func inputAnswer() -> [Int] {
while true {
print("숫자를 입력하세요.")
if let input = readLine() {
let answer = input.compactMap { $0.wholeNumberValue } // 문자열을 숫자로 변환
if validateInputAnswer(answer) { // 입력 검증 성공 시 반환
return answer
}
}
}
}
이슈 발생 원인
- compactMap { $0.wholeNumberValue }가 숫자가 아닌 문자를 자동으로 제거
- "1ㅁ23" 입력 시 wholeNumberValue는 [1, 2, 3]으로 변환
- 결과적으로 사용자가 잘못된 입력을 해도 숫자 부분만 남아 그대로 처리됨
해결 방법
- isNumber 프로퍼티를 활용하여 숫자로만 이루어진 입력만 허용하도록 개선
- 올바른 입력인지 먼저 검증한 후, 변환하는 방식으로 변경
수정된 코드
// 입력값 검증 (유효한 3자리 숫자인지 확인) → 유효하면 숫자 배열 반환, 유효하지 않으면 nil 반환
func validateInputAnswer(_ input: String) -> [Int]? {
// 입력값이 숫자로만 이루어져 있는지 확인
guard input.allSatisfy({ $0.isNumber }) else {
print("숫자가 아닌 문자가 포함되어 있습니다. 다시 입력해주세요.\n")
return nil
}
// 문자열을 숫자 배열로 변환
let inputAnswer = input.compactMap { $0.wholeNumberValue }
guard !inputAnswer.isEmpty else {
print("공백 입력은 허용되지 않습니다. 숫자를 입력해주세요.\n")
return nil
}
guard inputAnswer.count == 3 else {
print("3개의 숫자만 입력 가능합니다.\n")
return nil
}
guard inputAnswer.allSatisfy({ (0...9).contains($0) }) else {
print("0 - 9까지의 숫자만 입력 가능합니다.\n")
return nil
}
guard Set(inputAnswer).count == inputAnswer.count else {
print("숫자는 각각 한 개씩만 사용할 수 있습니다. ( 두 번 사용 불가능 )\n")
return nil
}
guard inputAnswer.first != 0 else {
print("첫 번째 숫자는 0이 될 수 없습니다.\n")
return nil
}
return inputAnswer // 모든 검증 통과 시 변환된 숫자 배열 반환
}
해결 후 결과
- "5ㅁ34" 입력 시 → "숫자가 아닌 문자가 포함되어 있습니다." 오류 출력
- "123" 입력 시 → 정상 입력
- "12" 입력 시 → "3개의 숫자만 입력 가능합니다." 오류 출력
수정 후 isNumber로 먼저 체크하면서 숫자로만 이루어진 입력만 통과하도록 개선됨.
이제 문자와 숫자가 섞인 입력("1ㅁ23")은 허용되지 않음 → 사용자 입력 오류 방지 성공
추가 학습 및 개선점
- wholeNumberValue는 숫자가 아닌 문자가 포함된 입력에서도 숫자를 걸러낼 수 있으므로 주의해야 함
- Swift의 isNumber를 활용하면 더 정확한 입력 검증이 가능
정리
문제
wholeNumberValue가 문자가 포함된 입력에서도 숫자만 걸러 변환하는 문제
원인
compactMap { $0.wholeNumberValue }가 숫자가 아닌 문자를 제거하기 때문
해결
sNumber를 먼저 체크한 후 변환하도록 수정
결과
숫자가 아닌 문자가 포함된 입력을 사전에 차단, 올바른 입력만 허용
반응형
'내배캠 iOS 마스터 6기' 카테고리의 다른 글
[ 내배캠 ] 야구게임 Lv 1 - Lv 3 (0) | 2025.03.11 |
---|---|
[ 내배캠 ] 팀소개카드 KPT (0) | 2025.03.07 |
[ 내배캠 ] Chapter 1 온보딩 주차 (0) | 2025.03.03 |
[ 사전캠프 6일차 ] 비동기 프로그래밍/ 제네릭 (0) | 2025.02.10 |
[ 사전캠프 4일차 ] 클로저/ 객체지향 프로그래밍 (0) | 2025.02.06 |