[Swift] String 좀 더 알아보기 (1)
[Swift] String
안녕하세요. 오늘은 Swift의 타입 중 하나인 String
에 대해 간단히 알아보는 시간을 갖도록 하겠습니다. 제가 String
을 포스팅하게 된 이유는 굳이 공부할 필요 없다고 생각하여 사용하다가 여러 크고 작은 문제에 부딛혀 이렇게 제대로 공부를 하고 기록을 하고자 포스팅을 하게 되었습니다.
이번 포스팅에서는 기본 String
부터 조금 더 심화된 부분까지 다뤄보도록 하겠습니다. 그럼 바로 시작해보도록 하겠습니다
Basic
- Swift의
String
에서는+
연산이 가능합니다.
- Swift4에서는
"""
과"""
사이에 여러 줄을 넣을 수 있습니다.
- 기본적으로 Swift에서
String
은 값 타입입니다. (String
은Struct
입니다.)
- 기본적으로
String
에는 내장된 메소드들이 존재합니다. - 그리고 반복문을 통해
String
의 각 문자들에 접근할 수 있습니다.
Intermediate
이제 String
을 인덱스를 통해 갖고 놀아보도록 하겠습니다. 다른 언어들에서는 단순히 정수의 인덱스로 각 문자열의 요소에 접근을 했습니다. 하지만 Swift에서는 이렇게 접근하는 것은 불가능합니다.
그럼 어떻게 접근을 해야할까요? Swift의 String
에는 기본적으로 특정 인덱스를 반환하는 메소드들이 다수 존재합니다. 그리고 이렇게 반환되는 인덱스들을 Int
타입이 아니라 String.Index
타입입니다.
이렇게 반환된 String.Index
타입으로는 String
의 요소에 접근이 가능합니다. 이제 각 인덱스를 출력해보고 값을 직접적으로 접근해보도록 하겠습니다.
textStartIndex
로 바로 출력을 하게 되면 원하는 인덱스 값이 출력되지 않습니다. 요소에 접근을 할 때는 바로 사용하지만 인덱스를 정수로 확인하고 싶다면textStartIndex.encodedOffset
으로 확인합니다..endIndex
를 통해 얻게 되는 인덱스는 마지막 인덱스 값에 +1 을 한 값이 됩니다. 그러므로 바로 해당 인덱스를 사용하여 요소에 접근을 하게 되면 에러가 발생하게 됩니다.
그리고 Offset
을 이용하여 기준 인덱스로부터 Offset
만큼 떨어진 위치의 요소에 접근이 가능합니다.
offsetBy
는 기본적으로 왼쪽에서 오른쪽 방향이 진행 방향입니다. 고로Hello
의 시작 인덱스에서 한 칸 옮긴 인덱스의 요소인e
가 됩니다.offsetBy
가 음수이면 진행 방향은 반대가 됩니다. 그리고endIndex
은 마지막 인덱스에서 + 1이기 때문에 비로소 마지막 인덱스의 요소인o
가 출력이 됩니다.
그리고 이렇게 인덱스들을 활용해 문자열을 나눌 수 있습니다.
..<
은 인덱스 미만,...
는 인덱스를 포함하는 것을 의미합니다.
주의해야할 점은 이렇게 잘린 데이터의 타입은 String
이 아니라 Substring
입니다. Substring
은 원본인 String
과 메모리를 공유하기 때문에 임시로 잠깐 사용하기에는 적합하나 지속적으로 사용하게 된다면 어느 시점에서 문제가 생길 수 있다.
애플의 공식 문서에는 다음과 같이 설명을 하고 있습니다.
substrings aren’t suitable for long-term storage – because they reuse the storage of the original string the entire original string must be kept in memory as long as any of its substrings are being used.
이렇게 타입이 다르기 때문에 String
타입의 변수에 Substring
값을 할당하게 되면 에러가 발생합니다. 그러므로 변환 과정이 필요하고 그 과정은 다음과 같이 매우 간단합니다.
그리고 생각보다 많이 사용하는 String
내장 메소드 중 하나인 .split()
역시 특정 기준점을 기준으로 나누어진 데이터들의 타입도 Substring
입니다. 고로 반드시 String( _ )
과정을 통해 String
으로 바꿔야 합니다.
마무리
오늘은 이렇게 제가 프로젝트를 진행하면서 String
을 다루면서 겪었던 크고 작은 문제점을 보완하기 위한 String
에 대한 공부해보았습니다. 부족하거나 틀린 부분이 있다면 많은 피드백 부탁드리겠습니다. 감사합니다!
참고자료