본문 바로가기
Swift

SwiftUI: String Subscript 접근

by songmoro 2023. 9. 23.
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 구조체를 사용해야 합니다.


참고

Subscript에 대해 알아보기 (feat.String)

Swift String 효율적으로 쓰기

String

Character

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