Character를 Int로 변환하는 방법 세 가지를 소개한다.
=> 문자.wholeNumberValue
=> 문자.hexDigitValue
=> Int(String(문자))
🔵 방법 1) .wholeNumberValue Property
참고: apple developer 공식 문서(링크), tutorialspoint(링크)
▶ 1-1. 설명
Character.wholeNumberValue
whole Number Value property를 사용해서 문자(Char) 타입의 변수를 정수(Int) 타입으로 변환할 수 있다.
특이하게도, 기호형이나 한자형("4", "④", "万") 까지 변환이 된다.
✔️ 조건 1 : 변환하려는 값은 문자(Character)여야 한다.
-> string 넣으면 오류 발생함.
✔️ 조건 2 : 값이 whole number (= 0 또는 자연수)여야 한다.
-> 조건 충족시 : optional Int 반환
-> whole number가 아니거나, 값이 정수로 변환하기에 너무 클 때 -> 'nil' 반환
* 'nil'은 우리가 아는 'null'과 동일함!
⚠️ 주의할 점: 값이 Optional로 반환되므로, 옵셔널을 제거하는 과정을 거쳐야 한다.
▶ 1-2. 예제
1-2-1. apple 공식 문서 예제
let chars: [Character] = ["4", "④", "万", "a"]
for ch in chars {
print(ch, "-->", ch.wholeNumberValue)
}
// Prints:
// 4 --> Optional(4)
// ④ --> Optional(4)
// 万 --> Optional(10000)
// a --> nil
1-2-2. [Swift|코드카타] 프로그래머스 #17. 자연수 뒤집어 배열로 만들기 (링크) - 풀이 2
func solution(_ n:Int64) -> [Int] {
return "\(n)".compactMap { $0.wholeNumberValue }.reversed()
}
🔵 방법 2) .hexDigitValue Property
▶ 2-1. 설명
Character.hexDigitValue
hexDigitValue 프로퍼티를 활용해서 hexadecimal digits를 숫자 값으로 변환할 수 있다.
hexadecimal digits(16진수)는 0-9, a-f, A-F 및 전체 너비 호환 형식을 포함한다. 만약 문자가 hexadecimal digits가 아닐 경우, 프로퍼티의 값은 nil이 된다.
⚠️ 주의할 점: 값이 Optional로 반환되므로, 옵셔널을 제거하는 과정을 거쳐야 한다.
(참고: apple 공식 문서)
▶ 2-2. 예제
2-2-1. apple 공식 문서 예제
let chars: [Character] = ["1", "a", "F", "g"]
for ch in chars {
print(ch, "-->", ch.hexDigitValue)
}
// Prints:
// 1 --> Optional(1)
// a --> Optional(10)
// F --> Optional(15)
// g --> nil
2-2-2. [Swift|코드카타] 프로그래머스 #17. 자연수 뒤집어 배열로 만들기 (링크) - 풀이 2
func solution(_ n:Int64) -> [Int] {
return "\(n)".compactMap { $0.hexDigitValue }.reversed()
}
🔵 방법 3) Int(String(Character))
참고: leechamin님 블로그 (링크)
▶ 3-1. 설명
Swift에서 character에 Int함수를 바로 씌우면 컴파일 에러가 발생한다.
Int() 함수는 인자(arguement)가 String형일 때만 사용할 수 있으므로
character -> string -> int 순으로 바꿔줘야 한다.
⚠️ 주의할 점: 값이 Optional로 반환되므로, 옵셔널을 제거하는 과정을 거쳐야 한다.
▶ 3-2. 예제
let char: Character = "1"
let number = Int(String(char))
print(number)
// 출력값 : Optional(1)
▶ 3-3. 참고 : Int(숫자) -> 숫자, Int(문자) -> 옵셔널
Int함수로 String을 감싸면 Optional이 반환되지만,
숫자를 감싸는 경우에는 옵셔널이 아닌 Int 형식의 숫자가 반환된다.
<String을 Int로 감싼 경우> : Optional<Int> 반환
var a: String = "123"
var x = Int(a)
print("x= \(x), 타입: \(type(of: x))")
// x= Optional(123), 타입: Optional<Int>
<Int64를 Int로 감싼 경우> : Int 반환
var a: Int64 = 123
var x = Int(a)
print("x= \(x), 타입: \(type(of: x))")
// x= 123, 타입: Int
Int64 또는 Int32로 감싸도 결과는 같게 나온다.
숫자는 숫자로, 스트링은 옵셔널로.
🆚 위 세가지 방법 비교
1. 세가지 모두 결과값이 옵셔널이다.
var a: [Character] = ["3"]
for i in a {
print(Int(String(i))) // Optional(3)
print(i.wholeNumberValue) // Optional(3)
print(i.hexDigitValue) // Optional(3)
}
2. 변환 가능한 문자에 차이가 있다.
- wholeNumberValue : 기호형, 한자형까지도 숫자로 변환함. ("4", "④", "万")
- hexDigitValue : hexadecimal digits을 10진수 숫자로 변환함. ("4", "a")
- Int(String(문자)) : 오직 숫자형 문자만 숫자로 변환함. ("4")
let chars: [Character] = ["4", "④", "万", "a"]
var wholeNumVal: [Character: Int] = [:]
var hex: [Character : Int] = [:]
var intStr: [Character : Int] = [:]
for ch in chars {
if let a = ch.wholeNumberValue {
wholeNumVal[ch] = a
}
if let b = ch.hexDigitValue {
hex[ch] = b
}
if let c = Int(String(ch)) {
intStr[ch] = c
}
}
print(wholeNumVal) // ["④": 4, "万": 10000, "4": 4]
print(hex) // ["4": 4, "a": 10]
print(intStr) // ["4": 4]
- 두 방법 중 .wholeNumberValue가 더 빠르다고는 하는데(링크) , 공식 문서에서 확인된 건 아니다.
🔴 옵셔널 제거 방법 3가지 💁🏻♀️
1. Forced Unwrapping (if you're sure it's safe) :
forced unwrapping('!')을 사용할 땐 주의해야 한다. 옵셔널이 'nil'일 경우, 시스템이 충돌하기 때문이다.
변환이 항상 성공하는 상황에서만 사용할 것!
let char: Character = "5"
// wholeNumberValue 뒤에 ! 붙이는 경우
let integerValue = char.wholeNumberValue!
print(integerValue) // 5
// 변수 뒤에 ! 붙이는 경우
let integerValue = char.wholeNumberValue
print(integerValue!) // 5
방법 : Optional로 선언된 변수(상수) 뒤에 !를 붙여주면 된다.
▽ [더보기] 클릭
예시 : a가 옵셔널 int라고 할 때,
var myInfo = "내 나이는 \(a!)살 입니다."
print(myInfo)
// 내 나이는 4살 입니다.
2. Optional Blinding:
if문을 사용하면 변환에 실패하는 경우를 적절히 처리할 수 있다.
let char: Character = "5"
if let integerValue = char.wholeNumberValue {
print(integerValue)
} else {
print("Conversion failed")
}
3. Nil Coalescing Operator:
이 경우, optional이 'nil'일 때 디폴트 값을 반환하게 한다.
아래 예시에서는 디폴트 값 = 0
let char: Character = "5"
let integerValue = char.wholeNumberValue ?? 0
print(integerValue)
'Swift > 문법' 카테고리의 다른 글
[Swift] 옵셔널(Optional) 제거 방법 3가지 (0) | 2024.02.15 |
---|---|
[Swift] 고차함수 - map 시리즈(map, flatMap, compactMap) (0) | 2024.02.14 |
[Swift] 고차함수 - map, filter, reduce (2) | 2024.02.07 |
[Swift] if...else 구문 대신 사용 가능한 Ternary Conditional Operator (삼항 연산자) (0) | 2024.02.07 |
[Swift] 함수 - 매개변수 앞 언더바('_') (외부 매개변수, 내부 매개변수) (2) | 2024.02.07 |