다른 언어와 다르게 Swift에서 String은 subscript가 안된다.
예를들어 str[0] 처럼 정수로 접근이 불가하고, String.Index를 사용해야 한다.
왜 그럴까?
그 이유는 Swift의 String은 유니코드(Unicode)를 엄격히 준수하기 때문이다.
Swift에서 String은 유니코드 문자열을 처리하도록 설계되었다고 한다.
유니코드는 다양한 언어와 문자를 지원하기 위해 복잡한 구조를 가지고 있다.
예를 들어, 이모지(emoji)나 특정 언어의 결합 문자(combining characters)는 여러 유니코드 스칼라 값으로 구성될 수 있다.
또한, 직접적인 인덱스 접근은 유니코드 문자 경계를 무시할 가능성이 있어, 오류를 발생시킬 수 있다고 한다.
따라서 String을 단순히 바이트 단위나 고정된 크기의 문자 배열로 처리할 수 없다고 한다.
아래 블로그에 좋은 예시가 있다.
Swift) String은 왜 subscript[Int]로 접근이 안될까?
swift String unicode subscript
velog.io
그냥 이모지를 넣고 싶어서 그런건가? 싶기도 하다.
그래서 Swift에서 String에 접근하려면 String.Index 타입을 사용해야 한다.
String은 내부적으로 Character의 컬렉션으로 동작한다.
String 을 제외한Character, Int 등은 subscript가 가능하다.
String.Index 예시
let str = "Hello, Swift!"
// 직접적인 서브스크립트는 불가능
// print(str[0]) // 컴파일 에러: 'subscript' is unavailable
// String.Index를 사용해야 함
let firstIndex = str.startIndex
let firstChar = str[firstIndex] // "H"
print(firstChar)
// 특정 위치로 이동하려면 인덱스를 계산
let thirdIndex = str.index(str.startIndex, offsetBy: 2)
let thirdChar = str[thirdIndex] // "l"
print(thirdChar)
Swift에서 String 처리를 편리하게 하기 위해선 다음과 같은 대안들이 있다.
문자열 처리 대안
1. 문자 배열로 변환
String을 Character 배열로 변환하면 일반적인 배열처럼 인덱스로 접근 가능하다.
let str = "Hello, Swift!"
let characters = Array(str)
print(characters[0]) // "H"
print(characters[2]) // "l"
2. Extension으로 커스텀 subscript
extension String {
subscript(i: Int) -> Character {
let index = self.index(self.startIndex, offsetBy: i)
return self[index]
}
subscript(range: Range<Int>) -> String {
let start = self.index(self.startIndex, offsetBy: range.lowerBound)
let end = self.index(self.startIndex, offsetBy: range.upperBound)
return String(self[start..<end])
}
}
let str = "Hello, Swift!"
print(str[0]) // "H"
print(str[0..<5]) // "Hello"
3. 문자열 슬라이싱 사용
let str = "Hello, Swift!"
let start = str.index(str.startIndex, offsetBy: 0)
let end = str.index(str.startIndex, offsetBy: 5)
let substring = str[start..<end] // "Hello"
print(substring)'DEV' 카테고리의 다른 글
| [iOS/Swift] 상속(Inheritance)과 프로토콜(Protocol) (0) | 2025.03.18 |
|---|---|
| [iOS/Swift] Sending 'closure' risks causing data races (data race) (0) | 2025.03.16 |
| [iOS/Swift] 수열과 구간 쿼리 1, 2 문제 풀이 (0) | 2025.03.13 |
| [Git] Merge를 잘못했다.. (0) | 2025.03.13 |
| [iOS/Swift] 야구게임 프로젝트 코드 리뷰/수정 (EOF, Dictionary, API Design Guidelines) (0) | 2025.03.13 |