# 스위프트 언어의 String에서 subscript를 통해 문자에 접근할 수 없는 이유에 대해 설명해주세요.
String은 [Int]로 접근하지 못하고String.index로 접근해야한다.
그 이유는 다음과 같다.
- 하나 이상의 Unicode Scalar가 모여 Character를 이루고 Character가 모여 String을 이룬다!
- 그런데 Character은 1개 이상의 unicode scalar로 이루어져있어 크기가 가변적이다.
- 어떠한 유니코드 스칼라를 기준으로 인덱싱을 지원해야하는 지가 애매하기 때문에 subscript로 접근하는 걸 제공하지 않는다.
- https://velog.io/@haze5959/Swift-Unicode-Scalar-그리고-문자열-count-시간-복잡도-관계
unicode Scalar의 가변성에 대한 코드 예시
let emojiWomanFamily = "👩👩👧👧" // 두명의 엄마와 두명의 딸로 구성된 가족
print(emojiWomanFamily.unicodeScalars.count) // 7
let emojiWomanFamily = "👩👩👧👧" // 두명의 엄마와 두명의 딸로 구성된 가족
print(emojiWomanFamily.count) // 1
Collection에 접근하는 방식에 관한 프로토콜
- BidirectionalCollection - 후방, 전방 순회를 둘 다 지원하는 컬렉션 Protocol, 시간복잡도 O(N) 접근
- RandomAccessCollection - 바로 접근 가능한 컬렉션 Protocol / 시간복잡도 O(1) 접근
- Unicode Scalar로 접근하는 특성상 직접 접근이 하닌 순차적인 접근으로 가야한다.
- 한 Character가 Unicode Scalar를 몇개 가지고 있을지 알 수 없기 때문에 순차적으로 접근하면서 체크해야 하기 때문이다.
- 또한 String은 BidirectionalCollection을 따르고 있기 때문에 직접 접근이 제한된다.
# Unicode Scalar란?
Swift의 문자열 타입은 Unicode Scalar 값에서 만들어진다. 여기서 말하는 Unicode Scalar란
- 크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법.
- Unicode기반 21-bit 코드
- UTF-32랑 거의 동일하다.
- 하나 이상의 Unicode Scalar가 모여Character를 이룬다.
- https://developer.apple.com/documentation/swift/unicode/scalar
# 스위프트 언어는 왜 Character가 unicode scalar로 이뤄지도록 하였나요?
- 유니코드 문자들이 깨지지 않은 상태로 보여줄 수 있기 때문이다
- 하지만 character 단위 문자열 처리에 비용이 많이 든다는 단점이 있다
- https://medium.com/@esung/swift의-문자열과-유니코드-af37a5d503a4
'면접질문정리' 카테고리의 다른 글
[Architecture] Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오. (0) | 2022.08.22 |
---|---|
[iOS] UIWindow의 역할은? (0) | 2022.08.22 |
[iOS] View Life Cycle (feat. drawing cycle) 호출순서? (0) | 2022.08.22 |
[Swift] Result Type이란? (0) | 2022.08.22 |
[Swift] lazy var로 초기화했을때의 장단점? (0) | 2022.05.09 |