Swift에서 문자열을 처리하는 방법 중에서 문자열을 쪼개야하는 경우에는 components와 split라는 메서드가 존재한다. 두 메서드 모두 문자열을 쪼개주는 메서드인데 과연 두 메서드의 차이점은 무엇이며 왜 같은 메서드가 두 개가 있는지 알아보도록 하자!!
먼저 components의 공식 문서를 한번 살펴보자.
components 메서드의 경우에는 매개변수가 seperator 하나만 있으며 매개변수로 받은 seperator을 기준으로 문자열을 분리하게 된다.
공식 문서를 보면 parameter로 String
을 받고 return을 [String]
형태로 반환해준다.
components는 Foundation 프레임 워크에 속해있기 때문에 components를 사용하기 위해서는 Foundation을 import 해야만 사용할 수 있다.
import Foundation
let str = "My name is Jake"
var result = str.components(seperatedBy: " ")
print(result) // ["My","name","is","Jake"]
위의 코드와 같이 " "
빈칸으로 분리를 하면 빈칸을 기준으로 문자열들이 String 배열 타입에 들어가 있는 것을 확인해 볼 수 있다.
다음은 split의 공식문서를 확인해보자.
split의 paramet에는 3가지가 있다. 하나씩 알아보자
Character
타입으로 매개변수로 받아서 해당 인자를 기준으로 쪼개 준다.
공식문서를 보면 반환하는 subsequence의 개수보다 하나 적거나 collection 타입을 잘라주는 최대 횟수이며, maxSplit
은 0보다 크거나 같아야하며 기본값은 Int = Int.max
라고 나와있다.
쉽게 설명하면 쪼개는 횟수이다. 예시를 보자
let str = "My name is Jake"
var result = str.split(separator: " ", maxSplit: 1)
print(result) // ["My","name is Jake"]
위의 코드를 보면 maxSplit이 1이기 때문에 공백을 기준으로 1번만 쪼깨지는 것을 확인해 볼 수 있다.
공식문서를 보면 Bool
타입을 매개변수로 받게 된다.
false인 경우에는 seperator의 인스턴스마다 결과에 ""
empty subsequence를 반환한다.
true인 경우에는 비어있지 않은 non-empty subsequence만 반환된다.
기본값은 true로 설정되어 있다고 한다.
위의 설명만 보면 도저히 무슨 얘기인지 감이 안온다. 아래의 예시를 보면 도움이 될 것이다.
var str = "My name is Jake "
var result = str.split(separator: " ", omittingEmptySubsequenece: false)
print(result) // -> ["My","name","is","Jake",""]
---------------------------------------------------------------------
var str1 = "My name is Jake "
var result1 = str1.split(separator: " ", omittingEmptySubsequenece: true)
print(result1) // -> ["My","name","is","Jake"]
false인 경우에는 Jake 뒤에 있는 빈칸에 대해서 split을 할 때 뒤에 아무것도 없기 때문에 ""
빈 subsequence를 돌려준 것을 확인할 수 있다.
반면에 true인 경우에는 ""
빈 subsequnece는 반환되지 않는 것을 확인할 수 있다.
공식 문서를 보면 parameter로 Character
를 받고 return을 [Substring]
형태로 반환해준다.
split은 Swift 표준 라이브러리에 포함되어 있어 components와는 다르게 Foundation을 import 하지 않아도 사용할 수 있다.
위에서 두 메서드에 대해서 알아보았다면 그렇다면 둘의 차이점은 무엇인지 정리해보자.
parameter의 개수
split: 3개 separator, maxSplit, omittingEmptySubsequeneces
components: 1개 separator
return 타입
split : [Substring]
components : [String]
Foundation 프레임워크의 import 여부
split: X
components: O
성능의 차이
split가 component에 비해서 성능이 좋다고 하는데 그 이유는 바로 ""
empty subsequence의 처리에 있다고 한다.
split은 위에서 보았듯이 omittingEmptySubsequence의 bool 값에 따라서 변하지만 components는 항상 empty subsequence를 돌려주게 되므로 만약 space를 separator로 가졌을 때 쪼개려는 문자열에 빈 공간이 많다면 그만큼 ""
empty subsequence를 반환하게 되므로 성능적으로 느리다고 한다.
var str = """
One of those refinements is to the String API, which has been made a lot easier to use (while also gaining power) in Swift 4. In past versions of Swift, the String API was often brought up as an example of how Swift sometimes goes too far in favoring correctness over ease of use, with its cumbersome way of handling characters and substrings. This week, let’s take a look at how it is to work with strings in Swift 4, and how we can take advantage of the new, improved API in various situations. Sometimes we have longer, static strings in our apps or scripts that span multiple lines. Before Swift 4, we had to do something like inline \n across the string, add an appendOnNewLine() method through an extension on String or - in the case of scripting - make multiple print() calls to add newlines to a long output. For example, here is how TestDrive’s printHelp() function (which is used to print usage instructions for the script) looks like in Swift 3 One of those refinements is to the String API, which has been made a lot easier to use (while also gaining power) in Swift 4. In past versions of Swift, the String API was often brought up as an example of how Swift sometimes goes too far in favoring correctness over ease of use, with its cumbersome way of handling characters and substrings. This week, let’s take a look at how it is to work with strings in Swift 4, and how we can take advantage of the new, improved API in various situations. Sometimes we have longer, static strings in our apps or scripts that span multiple lines. Before Swift 4, we had to do something like inline \n across the string, add an appendOnNewLine() method through an extension on String or - in the case of scripting - make multiple print() calls to add newlines to a long output. For example, here is how TestDrive’s printHelp() function (which is used to print usage instructions for the script) looks like in Swift 3
"""
var newString = String()
for _ in 1..<9999 {
newString.append(str)
}
var methodStart = Date()
_ = newString.components(separatedBy: " ")
print("Execution time Separated By: \(Date().timeIntervalSince(methodStart))")
methodStart = Date()
_ = newString.split(separator: " ")
print("Execution time Split By: \(Date().timeIntervalSince(methodStart))")
다음과 같은 문자열을 9999번 붙이고 난 뒤 components와 split을 사용해서 " "
space를 separator로 하여 수행속도를 비교해보았을 때, Xcode에서 실행해 본 결과는 아래와 같았다.
따라서 결론은 split이 components보다는 빠르다는 것이다!!
Apple 공식문서 components
Apple 공식문서 split
split과 components
stackOverflow split VS components