-
이 문제를 풀다가 아스키코드 변환이 생각보다 불편해서 정리해야겠다는 생각이 들었다..
파이썬이나 C++은 정말 편하게 했는데...let str = "abcde" print("Test 1 :\n") for ch in str { // asciiVaule: UInt8? let a = ch.asciiValue! print(a, type(of: a), separator: " is ") print(a, UnicodeScalar(a), type(of: UnicodeScalar(a)), separator: " -> ") } print("=============\n") print("Test 2 :\n") for ch in str { let u = ch.unicodeScalars.first!.value print(u, type(of: u), separator: " is ") print(u, UnicodeScalar(u), type(of: UnicodeScalar(u)), separator: " -> ") } print("\n----OR----\n") for ch in str.unicodeScalars { print(ch.value, type(of: ch.value), separator: " is ") } print("=============\n") print("Test 3 :\n") for ch in str.utf16 { print(ch, type(of: ch), separator: " is ") } print("=============\n") print("Test 4 :\n") for ch in str { let u = (UnicodeScalar(String(ch))!.value) print(u, type(of: u), separator: " is ") print(u, UnicodeScalar(u), type(of: UnicodeScalar(u)), separator: " -> ") }
Test 1 : 97 is UInt8 97 -> a -> Scalar 98 is UInt8 98 -> b -> Scalar 99 is UInt8 99 -> c -> Scalar 100 is UInt8 100 -> d -> Scalar 101 is UInt8 101 -> e -> Scalar ============= Test 2 : 97 is UInt32 97 -> Optional("a") -> Optional<Scalar> 98 is UInt32 98 -> Optional("b") -> Optional<Scalar> 99 is UInt32 99 -> Optional("c") -> Optional<Scalar> 100 is UInt32 100 -> Optional("d") -> Optional<Scalar> 101 is UInt32 101 -> Optional("e") -> Optional<Scalar> ----OR---- 97 is UInt32 98 is UInt32 99 is UInt32 100 is UInt32 101 is UInt32 ============= Test 3 : 97 is UInt16 98 is UInt16 99 is UInt16 100 is UInt16 101 is UInt16 ============= Test 4 : 97 is UInt32 97 -> Optional("a") -> Optional<Scalar> 98 is UInt32 98 -> Optional("b") -> Optional<Scalar> 99 is UInt32 99 -> Optional("c") -> Optional<Scalar> 100 is UInt32 100 -> Optional("d") -> Optional<Scalar> 101 is UInt32 101 -> Optional("e") -> Optional<Scalar>
1. asciiValue
우선 Test 1에 있는 asciiValue부터 보자.
- Character Type에 사용할 수 있다.
- 해당 문자의 아스키코드 값을 UInt8?로 반환하므로 옵셔널을 벗기고 Int 타입으로 변환하면 된다.
2. unicodeScalars
두 번째 방법은 Test 2에 있는 unicodeScalars이다.
문자열이 UnicodeScalarView라는 구조로 되어 있고 그 값을 접근하려면 unicodeScalars를 통해서 하면 된다는 것 같은데..
Swift의 String 세계는 너무 복잡한 것 같다... 원문 링크는 이곳에...Test 2에서 두 가지 방법을 사용했는데 첫 번째 방법은 이 분의 블로그에서 참고했다.
차이점은 문자열(String)이 아닌 문자(Character)에 unicodeScalars 프로퍼티를 적용했다는 점이다.
왜 그런지 한참 고민하다가 찾아보니 Character.UnicodeScalarView가 있었다. 진작 찾아볼걸두 번째 방법은 문서 링크에 있는 예제처럼 문자열의 unicodeScalars 프로퍼티를 통해 아스키코드 값을 출력한다.
반환된 값의 타입은 UInt32이다.3. utf16
세 번째 방법은 UTF16 View이다.
문자열을 UTF-16 포맷으로 보여주는 속성이다. (UTF-8도 있다)
UTF16 View 또는 UTF8 View로 변경하면 해당 코드 포맷의 컬렉션이 된 것이기 때문에 요소에 접근해야 한다.
즉 UTF16 View 타입에서 Unit을 가져와야 한다.예시를 통해 보자면
A를 문자열로 입력받아 utf16 포맷으로 변환하고 나니 UTF16 View 타입이 된 것을 볼 수 있고,
first 프로퍼티를 통해 가져온 Unit의 타입은 UInt16? 인 것을 확인할 수 있다.4. UnicodeScalar
네 번째 방법은 Unicode.Scalar의 typealias인 UnicodeScalar이다.
초기화 방법이 다음과 같기 때문에 Character를 String으로 변환하여 value프로퍼티를 이용하면 유니코드 값을 얻을 수 있다.
이렇게 번거롭게 변환하는 것보단 1번 방법을 자주 사용할 것 같다.
어려웠지만 다른 방법을 이리저리 찾아보는 과정이 꽤 재밌었다.
잘못된 부분 또는 부족한 점 지적해주시면 감사하겠습니다!
'공부 > Swift' 카테고리의 다른 글
print() vs dump() (0) 2021.06.02 알고리즘 문제 풀이에 필요한 Swift 팁 정리 (0) 2021.03.26 댓글