본문 바로가기

swift

[swift] String.Index와 String.SubSequence(Substring)

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 String 다루기

Swift의 String method들에 대해 알아봅니다.

hcn1519.github.io

 

문자열을 문자 단위로 다루기 | Swift

iOS 및 macOS 용 앱 개발, Emacs, Vim, Python 위주로 다루는 Seorenn 개인 블로그

seorenn.blogspot.com

 

'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