본문 바로가기

Swift

[Swift] split vs components (Substring)

Apple Developer - split

Apple Developer - component

 

빠른 결론

문자열을 특정 구분자를 통해 배열로 반환해야할 땐 components를 사용하는게 좋다.

split을 사용할 경우 반환값으로 Substring이 반환되어 메모리 누수 위험이 생길 수 있기 때문이다.

split vs components

String 타입의 데이터를 주어진 조건에 따라 분할하여 배열을 반환하는 메소드 split & components 는 어떤 차이가 있을까?

split

func split(separator: Character,
		   maxSplits: Int = Int.max,
           omittingEmptySubsequences: Bool = true) -> [Substring]
  • separator : 분할하는 기준
  • maxSplits : 컬렉션을 분할할 최대 횟수, 반환할 하위 시퀸스보다 하나 적다. 그리고 0보다 크거나 같아야 한다.
  • omittingEmptySubsequences : false인 경우 각 인스턴스에 대한 결과에 빈 하위 시퀸스가 반환됩니다. true일 경우 비어있지 않은 하위 시퀸스만 반환됩니다. 기본값은 true

split의 특징은 반환값이 Substring이라는 타입으로 이루어진 배열을 반환한다.

Substring은 구조체로서 split의 결과이외에도 String.Index를 통한 부분 문자열 연산을 했을 때 얻을 수 있는 결과물이며 원래 문자열과 저장소를 공유한다는 특징을 갖고 있다.

Substring이 원래 문자열과 저장소를 공유한다는 특징 때문에 부분 문자열을 저장할 시 원래 문자열에 대한 참조 해제가 되어도 Substring으로 인해 강한 참조가 유지되므로 문자열의 데이터 수명이 연장되며 이는 메모리 누수로 나타날 수 있습니다.

components

func components(separatedBy separator: String) -> [String]
  • separatedBy : 분할하는 기준

components의 특징은 NSString에 속한 메소드로 NSString은 Foundation에 포함되어 있는 클래스로서 Foundation을 import해야 components를 사용할 수 있습니다.

그리고 split과 다르게 반환값으로 String 타입을 반환하기 때문에 반환값에 대해 별도의 작업을 할 필요가 없습니다.