Open ronick-grammer opened 1 year ago
Unicode scalar
의 시작이나 끝 부터 탐색 해야 한다.String
과 Character
는 Unicode
를 완전히 준수하고 있다.String
의 문자 개수를 구하기 위해서는 String
을 구성하고 있는 Extended Grapheme Cluster
를 계산하기 전에는 길이를 구하기 불가능 하기 때문 이다. Unicode scalar 란?
- 크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법
- Unicode 기반 21-bit 코드
- 하나 이상의 Unicode scalar가 모여 Character를 이룬다 .
Extended Grapheme Cluster 란?
- Swift의 모든
Character type
은 하나의 확장된Grapheme Cluster
로 나타낸다.- 한개 이상의
Unicode sclar
시퀸스로 사람이 읽을 수 있는 문자를 생성한다.
let usFlag: Character = "\u{1F1FA}\u{1F1F8}"
print(usFlag)
String type
에서 subscript
를 사용 하여 접근하는 방법은 index(i: String.Index, offsetBy distance: Int) -> String.Index
메서드를 사용하여 문자열 요소에 접근하면 된다.extension String {
subscript(index: Int) -> Character {
return self[self.index(self.startIndex, offsetBy: index)]
}
}
var name: String = "jenny"
for i in 0 ..< name.count {
print(name[i])
}
let apple = "🍎"
print("Characters count : \(apple.count)")
for i in apple {
print(type(of: i), i)
if i == apple.last {
print("********************")
}
}
print("Unicode Scalar's count : \(apple.unicodeScalars.count)")
for i in apple.unicodeScalars {
print(type(of: i), i)
if i == apple.unicodeScalars.last {
print("********************")
}
}
print("utf8 Scalar's count : \(apple.utf8.count)")
for i in apple.utf8 {
print(type(of: i), i)
if i == apple.utf8.last {
print("********************")
}
}
print("utf16 Scalar's count : \(apple.utf16.count)")
for i in apple.utf16 {
print(type(of: i), i)
if i == apple.utf16.last {
print("********************")
}
}
Characters count : 1
Character 🍎
********************
Unicode Scalar's count : 1
Scalar 🍎
********************
utf8 Scalar's count : 4
UInt8 240
UInt8 159
UInt8 141
UInt8 142
********************
utf16 Scalar's count : 2
UInt16 55356
UInt16 57166
********************
let sentence = "Accessing String View Elements"
let firstSpace = sentence.firstIndex(of: " ") ?? sentence.endIndex
let firstWord = sentence[..<firstSpace]
print(firstWord)
//Accessing
subscript(index: Int) -> Int {
get {
// 적절한 반환 값
}
set(newValue) {
// 적절한 set 액션
}
}
Swift에서 String은 가변의 크기를 가지기 때문에 Int 기반의 인덱스 참조가 불가능
Unicode scalar란 크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법으로, 하나 이상의 Unicode Scalar가 모여 Character를 이루고, Character들이 모여 String이 됨
String의 요소는 Int형을 파라미터로 사용해 subscript로 접근이 안되는 이유
Array
는Int
형 index를 파라미터로 넘겨주어subscript
를 통해 해당 요소에 접근할 수 있지만,String
은String.Index
구조체를 파라미터로 넘겨주어subscript
를 통해 해당 요소에 접근해야 한다.Character
타입(orUnicode Scalar
들)으로 구성되어 있다.String
은subscript
를 통해 요소에 접근할때 순차적으로 순회한다.Array
등) 은RandomAccessCollection
프로토콜을 채택하고 있어 O(1) 의 시간복잡도로 요소에 접근한다.String
은BidirectionalCollection
프로토콜을 채택하여 순차적으로 요소를 조회하면서 타겟 요소까지 접근하여 구성하고 있는Unicode Scalar
값의 갯수에 상응하는 O(n)의 시간복잡도가 소요된다.String
을 이루는Character
(orUnicode Scalar
들)의Unicode Scalar
값 갯수가 다를 수 있기 때문에 순차적으로Unicode Scalar
요소들을 하나하나 순회하여 하나의 문자(ex. "\u{1112}\u{1161}\u{11AB}" // "한"
)를 찾는다.String
의 요소를Int
형 파라미터를 사용해subscript
로 접근할 수 있는 방법📝 참고 사이트