728x90
우선, 서브스크립트는 클래스, 구조체, 열거형에서 정의해서 사용하는 스크립트입니다.
컬렉션, 리스트, 시퀀스와 같이 집합 내 속한 요소를 접근할 수 있게 해주는 문법으로 메서드의 구현 없이도 값을 읽고 쓰는 것을 가능하게 합니다.
예를 들어, Array[Int], Dictionary[Key]와 같이 사용해요.
하지만 Swift에서는 타 프로그래밍 언어들과 다르게 String.Index를 사용해야 한다며 문자열의 요소에 서브스크립트로 접근하지 못합니다.
let str = "ABCDEF"
print(str[0])
// 'subscript(_:)' is unavailable:
// cannot subscript String with an Int, use a String.Index instead.
이는 String의 요소인 Character가 Unicode scalar로 이루어진 가변적인 값이기 때문입니다.
String: A Unicode string value that is a collection of characters.
모든 Character는 하나 이상의 유니코드 스칼라 값으로 구성되어 있어요.
아스키 코드 A의 Scalar 값은 65로 Scalar, UTF-8, UTF-16에 들어갈 수 있을 만큼 충분히 적은 수이지만,
이모티콘 👾는 UTF-8, UTF-16에 비해 너무 크기 때문에 뷰는 각각 다른 값을 초래할 수 있어요.
let str: Character = "A"
print(str)
// A
str.unicodeScalars.map {
print(type(of: $0), $0)
}
// Scalar A
str.utf8.map {
print(type(of: $0), $0)
}
// UInt8 65
str.utf16.map {
print(type(of: $0), $0)
}
// UInt16 65
let str: Character = "👾"
print(str)
// 👾
str.unicodeScalars.map {
print(type(of: $0), $0)
}
// Scalar 👾
str.utf8.map {
print(type(of: $0), $0)
}
// UInt8 240
// UInt8 159
// UInt8 145
// UInt8 190
str.utf16.map {
print(type(of: $0), $0)
}
// UInt16 55357
// UInt16 56446
따라서 문자열의 요소에 접근하기 위해서는 서브스크립트 대신 String.Index 구조체를 사용해야 합니다.
참고
728x90
'Swift' 카테고리의 다른 글
Swift: Mutating (0) | 2023.09.24 |
---|---|
Swift: Key Value Observing, KVO (1) | 2023.09.24 |
SwiftUI: Hashable, Equatable (0) | 2023.09.23 |
SwiftUI: Codable, Encodable, Decodable (0) | 2023.09.15 |
SwiftUI: Optional (0) | 2023.09.15 |