Swift + iOS/Swift

[Swift] String 좀 더 알아보기 (1)

군옥수수수 2018. 1. 1. 20:48

[Swift] String


안녕하세요. 오늘은 Swift의 타입 중 하나인 String에 대해 간단히 알아보는 시간을 갖도록 하겠습니다. 제가 String을 포스팅하게 된 이유는 굳이 공부할 필요 없다고 생각하여 사용하다가 여러 크고 작은 문제에 부딛혀 이렇게 제대로 공부를 하고 기록을 하고자 포스팅을 하게 되었습니다.


이번 포스팅에서는 기본 String부터 조금 더 심화된 부분까지 다뤄보도록 하겠습니다. 그럼 바로 시작해보도록 하겠습니다


Basic


  • Swift의 String에서는 + 연산이 가능합니다.

  • Swift4에서는 """""" 사이에 여러 줄을 넣을 수 있습니다.

  • 기본적으로 Swift에서 String은 값 타입입니다. (StringStruct입니다.)

  • 기본적으로 String에는 내장된 메소드들이 존재합니다.
  • 그리고 반복문을 통해 String의 각 문자들에 접근할 수 있습니다.

Intermediate

이제 String을 인덱스를 통해 갖고 놀아보도록 하겠습니다. 다른 언어들에서는 단순히 정수의 인덱스로 각 문자열의 요소에 접근을 했습니다. 하지만 Swift에서는 이렇게 접근하는 것은 불가능합니다.



그럼 어떻게 접근을 해야할까요? Swift의 String에는 기본적으로 특정 인덱스를 반환하는 메소드들이 다수 존재합니다. 그리고 이렇게 반환되는 인덱스들을 Int타입이 아니라 String.Index타입입니다.



이렇게 반환된 String.Index타입으로는 String의 요소에 접근이 가능합니다. 이제 각 인덱스를 출력해보고 값을 직접적으로 접근해보도록 하겠습니다.


  • textStartIndex로 바로 출력을 하게 되면 원하는 인덱스 값이 출력되지 않습니다. 요소에 접근을 할 때는 바로 사용하지만 인덱스를 정수로 확인하고 싶다면 textStartIndex.encodedOffset으로 확인합니다.
  • .endIndex를 통해 얻게 되는 인덱스는 마지막 인덱스 값에 +1 을 한 값이 됩니다. 그러므로 바로 해당 인덱스를 사용하여 요소에 접근을 하게 되면 에러가 발생하게 됩니다.

그리고 Offset을 이용하여 기준 인덱스로부터 Offset 만큼 떨어진 위치의 요소에 접근이 가능합니다.

  1. offsetBy는 기본적으로 왼쪽에서 오른쪽 방향이 진행 방향입니다. 고로 Hello의 시작 인덱스에서 한 칸 옮긴 인덱스의 요소인 e가 됩니다.
  2. 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 에 대한 공부해보았습니다. 부족하거나 틀린 부분이 있다면 많은 피드백 부탁드리겠습니다. 감사합니다!


참고자료


  1. Swift String Cheat Sheet
  2. Updating Strings For Swift 4