[번역] Swift Standard Library — Indexing and Slicing Strings

유태건
2 min readNov 15, 2019

--

우리는 보통 문자열은 화면에 보이는 문자들의 연속이라고 생각합니다. 그러나 가끔 한 문자로 보이는 것이 메모리에서는 여러 개의 가변 길이인 유니코드 스칼라(참조)로 되어 있는 경우가 있습니다. 예를 들어, 모자 이모지(🎩)와 같은 문자를 인코딩하는 데는 단순한 문자인 A 보다 더 많은 비트가 필요합니다. 그리고 é⃝ 처럼 결합 마크가 있는 문자를 나타내기 위해서는 더 많은 유니코드 스칼라가 필요합니다. Swift의 유니코드 지원에 대해 더 알고 싶다면 The Swift Programming LanguageStrings and Characters를 참조하세요.

Swift의 String 타입은 위와 같은 상세한 사항을 처리해 줍니다. 문자열의 각 Character 요소는 사람이 이해하는 유니코드 문자를 나타냅니다. 메모리에서의 문자의 길이나 표현과는 상관없이 말이죠. 하지만, 이러한 추상화 때문에 문자열을 정수를 이용해 인덱싱할 수 없습니다. 그 대신 Swift 표준 라이브러리에는 String.Index라는 타입이 존재합니다. 메모리의 표현에 상관 없이 문자열의 위치를 더욱 잘 표현하죠.

아래의 문자열을 한번 보세요. 각종 다양한 크기와 종류의 유니코드 문자가 들어 있네요.

그리고 아래는 문자열의 문자들을 사람이 이해하는 인덱스와 비교한 것입니다. 여기서 주목할 것은, 깃발(🇺🇸)은 사실 두 개의 유니코드 스칼라가 결합된 ‘grapheme cluster’(참조)이지만, Swift는 이를 사람이 이해하는 문자 하나로 센다는 것입니다. 이렇게 하면 폼 유효성 검사나 커서 위치 지정, 텍스트 래핑 같은 작업을 훨씬 쉽게 구현할 수 있습니다. 그러니까 카운팅과 인덱싱, 슬라이싱 같은 작업은 메모리에서의 문자열 구성보다는 모두 사람이 이해하는 문자 인덱스를 기반으로 한다는 것이죠.

--

--

유태건

iOS와 Swift에 관심이 많은 고등학생입니다.