String.Index
String.Index 타입은 swift에서 문자열의 index를 나타낸다.
c++에서 문자열의 첫번째 문자를 가리키고 싶다면 s[0]과 같은 방식으로 정수를 넣어주면 되지만, swift에서는 String.Index 타입을 넣어주어야 한다.
// s = "abc"
let start = s.index(after: s.startIndex)
let end = s.index(before: s.endIndex)
print(String(s[start])) // "b"
print(String(s[end])) // "c"
startIndex : 문자열의 맨 처음을 가리키는 인덱스 ("abc"에서는 a를 가리킴)
endIndex : 문자열의 맨 끝을 가리키는 인덱스 ("abc"에서는 \0를 가리킴)
문자열은 "abc\0"의 형태로 이루어져 있기 때문에 \0을 가리키는 것이 맞다. c를 가리킨다고 생각하면 안 됨!
start 변수는 startIndex의 다음 인덱스를 가리키기 때문에 두번째 글자인 b를 가리킨다.
s.index(before: s.startIndex) <- 맨 처음의 이전을 가리키려 하기 때문에 오류 발생
같은 이유로 s.index(after: s.endIndex) 또한 오류가 나타난다. 맨 끝 글자의 다음을 가리키려 하기 때문.
let index = s.index(s.startIndex, offsetBy: 1) // startIndex + 1
let index2 = s.index(s.endIndex, offsetBy: -3) // endIndex - 3
print(s[index]) // "b"
print(s[index2]) // "a"
위와 같이 offset을 사용해 원하는 위치에 쉽게 접근할 수 있다.
String.SubSequence
swift는 String.SubSequence(=Substring) 라는 타입을 가진다.
// s = "asdfgh"
let index = s.index(s.startIndex, offsetBy: 1)
let index2 = s.index(s.endIndex, offsetBy: -3)
print(s[index...index2]) // "sdf"
print(s[index..<index2]) // "sd"
print(String(s[index...index2])) // String으로 type casting
substring은 새로운 메모리를 할당하지 않고, 기존 string의 메모리를 재사용한다고 합니다. 메모리 재사용은 메모리 할당 비용을 줄여준다는 장점이 있습니다. 하지만 장기로 string을 저장하는 경우에는 이 방법이 적절하지 않다고 합니다 ~~ (왜?)
참고
'swift' 카테고리의 다른 글
[swift] 고차함수 - 맵 (Map), 필터(Filter) (0) | 2020.07.26 |
---|---|
[swift] sort와 sorted (0) | 2020.07.23 |
[swift] 클로저 (closure) (0) | 2020.06.25 |
[swift] 값 타입 vs 참조 타입 (0) | 2020.06.22 |
[swift] 열거형 (enum) (0) | 2020.06.22 |