class, struct, enum 타입에서 컬렉션, 배열 등의 멤버 요소에 index를 이용하여 간단하게 접근할 수 있는 방법.
Swift에서 String은 각 문자를 이루고 있는 메모리의 크기가 가변적이기 때문에 Int 형식의 Subscript로는 접근이 불가하고, associated index 타입으로 String.index를 통해 접근이 가능하다.
Subscripts란?
https://docs.swift.org/swift-book/LanguageGuide/Subscripts.html
Classes, structures, and enumerations can define subscripts, which are shortcuts for accessing the member elements of a collection, list, or sequence. You use subscripts to set and retrieve values by index without needing separate methods for setting and retrieval.
컬렉션, 리스트, 시퀀스 등의 인스턴스를 index로 접근할 수 있도록 해주는 서브스크립트.
someArray[index] 로 배열 인스턴스에 접근 가능하고, someDictionary[key] 의 형식으로 딕셔너리 인스턴스에 접근이 가능하다.
왜 String은 subscript로 접근이 안되는 걸까?
다른 언어들에서는 Int 자료형 index로 문자열에 접근이 가능하지만, Swift에서는 String에서 Int 형식으로 인덱스 참조가 불가능하다.
Int로 서브스크립트를 사용할 수 없고 String.index로 각 Character의 위치에 접근할 수 있다.
문자열 내부의 각 문자들이 늘 같은 메모리로 저장되는 것이 아니기 때문에, 해당 문자의 위치에 접근하기 위해서는 각 Unicode scalar 의 시작이나 끝부터 탐색을 해야 한다.
Unicode scalar란 크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법으로
하나 이상의 Unicode Scalar가 모여 Character를 이루고, Character들이 모여 String이 된다.
예를 들어 "h" 의 경우, UTF-8로 인코딩하면 길이가 1을 차지하지만, "홍" 이라는 문자의 경우, 3을 차지한다.
이처럼 문자열 내부의 각 문자가 늘 동일한 바이트 수를 차지하는 것이 아니기 때문에, Int 형식의 Subscript를 사용해서 특정 위치에 있는 문자에 접근하는 것은 불가능하다.
따라서 Swift에서 문자열 내의 각 Character는 언어 마다 그 크기가 가변적일 수 있기 때문에 Subscript 대신 index를 사용하여 올바른 위치에 접근할 수 있다.
참고 :
The Swift Programming Language - Documentation <Strings and Characters>
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/stringsandcharacters
Unicode Scalar - velog.haze5959
+ Bidirectional & RandomAccess Collection
보통의 경우 Random Access 방법으로 임의의 거리만큼 떨어진 원소를 O(1)의 시간복잡도로 조회할 수 있지만,
Swfit의 String.Index는 BidirectionalCollection 프로토콜을 채택하여, 문자열의 index 탐색구조는 무조건 자신의 앞 뒤로만 탐색할 수 있는 양방향 순회방식으로 O(n)의 시간복잡도가 필요하다.
참고 : green iOYES - 왜 Swift에서는 String이 subscript로 접근이 안되는가, Havi log, donklee.log,
'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글
[Cocoa Design Pattern] Singleton Pattern (0) | 2022.12.22 |
---|---|
[Cocoa Design Pattern] Delegation Pattern (0) | 2022.12.22 |
[Swift] Any와 AnyObject 비교 및 장단점 (0) | 2022.12.10 |
[Swift] Type Casting 타입 캐스팅 (0) | 2022.12.10 |
[Swift] Initialization + Convenience init 이란? (0) | 2022.12.08 |