Extended Grapheme Clusters ( 확장된 문자소 클러스터 )
Swift의 String과 Character은 Unicode와 호환됩니다.
Swift의 String 타입은 Unicode scalar value로 빌드되며 Unicode scalar value는 character나 수식어를 위한 고유한 21bit 숫자로 이루어져 있습니다.
확장된 문자소 클러스터(extended grapheme cluster)는 사람이 읽을 수 있는 단일 문자로 하나 이상의 Unicode scalar sequence로 구성된 됩니다.
따라서 Swift의 Character 타입의 모든 인스턴스는 하나의 확장된 문자소 클러스터(extended grapheme cluster)로 표기됩니다!
let eAcute: Character = "\u{E9}" // é
let combinedEAcute: Character = "\u{65}\u{301}" // e followed by ́
// eAcute is é, combinedEAcute is é
마찬가지로 확장된 문자소 클러스터로 한글과 같은 복잡한 스크립트를 하나의 Character로 표현하게 할 수 있습니다.
let precomposed: Character = "\u{D55C}" // 한
let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // ᄒ, ᅡ, ᆫ
// precomposed is 한, decomposed is 한
[주의]
String의 count프로퍼티로 반환된 문자의 개수는 같은 문자여도 NSString의 length 프로퍼티와 다를 수 있다고 합니다.
NSString은 문자열 내에 확장된 문자소 클러스터(extended grapheme cluster)로 length를 계산하는 것이 아닌 문자열의 UTF-16 표현의 16bit 단위를 기반으로 계산한다고 합니다.
그렇다면 Swift의 String이 count 하는 단위는 확장된 문자소 클러스터(extended grapheme cluster)라고 이해할 수 있겠죠.
같은 모양이어도 표현되는 확장된 문자소 클러스터가 다르다면 문자열 동등비교는 어떻게 수행할까?
우선 Swift에서 문자열 동등 비교는 == 연산자와 != 연산자를 사용하며 비교합니다.
위에서 예시로 든 서로 다른 Unicode scalar를 가진 확장된 문자소 클러스터(extended grapheme cluster)인 '한'을 동등비교 해보면 같은 문자로 판별됨을 알 수 있습니다.
왜냐하면 확장된 문자소 클러스터(extended grapheme cluster)는 다른 Unicode scalar로 구성되어 있더라도 언어적 의미와 모양이 같으면 같은 문자라고 판단한다고 합니다.
*Swift의 String은 NSString class와 bridging 되어 있기 때문에 Foundation 패키지를 import 하여 사용하면 Swfit String에서 별도의 변환과정 없이 NSString method에 접근할 수 있습니다.
https://developer.apple.com/documentation/swift/string#2919514
'iOS > Swift' 카테고리의 다른 글
[Swift] AnyObject란? (런타임 시점에 결정된다) (0) | 2023.02.23 |
---|---|
[Swift] String과 Substring을 메모리에서 효율적으로 관리하는 방법 (0) | 2023.02.18 |
[Swift] Convenience initializer 알아보기 (0) | 2023.02.16 |
[Swift] CoW(Copy on Write)의 동작방식 + 메모리 주소 디버깅 (1) | 2023.02.16 |
[Swift] Class의 성능을 향상 시킬수 있는 방법 :: Static Dispatch (0) | 2023.02.09 |