문자열을 다룰 때 주로 쓰는 메서드들을 살펴보자.
Split(separator : )
separator를 인자로 하여 받은 값을 기준으로 대상 문자열을 나눈다.
예를 들어서 "this is a remote controller"를 " "(공백)으로 나눈다고 할 경우 ["this" "is" "a" "remote" "controller"] 를 결과로 얻게 된다.
var s = "this is a remote controller"
var splited = s.split(separator: " ")
print(splited) // ["this" "is" "a" "remote" "controller"]
이렇게 공백을 빼고 반환해준다는게 장점이다.
하지만! [Substring]으로 반환되어 바로 사용하기에는 껄끄러운 부분이 있다.
만약 공백이 두 칸일 경우엔 어떨까?
var s = " this is a remote controller "
var splited = s.split(separator: " ")
print(splited) // ["this" "is" "a" "remote" "controller"]
이상없이 그대로 반환된다!
separator에 공백이 아닌 문자열이 들어가면 어떨까?
var s = "this is powerful pineapple"
print(s.split(separator: "p")) // ["this is ", "owerful ", "inea", "le"]
보면 p가 모두 잘 빠진 것을 볼 수 있다.
특히 p를 3개나 포함하던 pineapple에서는 첫 번째 p를 제외한 inea까지, 그리고 중간의 p 2개를 제외하고 le가 붙어 나온 것을 볼 수 있다.
즉 개수에 관계없이 모두 삭제하고, 값이 있는 부분만 리턴하는 것이다.
Components(separatedBy: )
이 메서드 또한 문자열을 나눌 때 사용하는데, 반환값이 [String]이어서 바로 사용하기 좋다는 점이 있다.
split과의 차이점으로는 구분자를 1개만 삭제하고 그대로 결과에 반환한다는 것인데, 실 사용 사례를 보면 이해가 빠를 것이다.
아래 문자열은 공백이 모두 2칸이다.
var s = " this is a remote controller "
var components = s.components(separatedBy: " ")
print(components) // ["", "", "this", "", "is", "", "a", "", "remote", "" "controller", "", ""]
자세히 보면 문자열 사이에 있던 공백만 1개씩 줄어들고, 문자열의 앞뒤 부분은 제대로 처리가 되지 않은 것을 볼 수 있다.
separatedBy에 문자열을 받으면 어떻게 될까?
var s = "this is powerful pineapple"
print(s.components(separatedBy: "p")) // ["this is ", "owerful ", "inea", "", "le"]
응?
아까 split에서는 ""와 같은 공백은 나오지 않았었다.
즉, pp와 같이 붙어있을 때에는 두 개를 지우되, 흔적을 남기게 된다.
아까 위에서도 문자열 사이의 공백 두 칸을 한 칸만 놔두고 반환한 것과 같은 모습니다.
더 많은 차이점이 있겠지만 이 정도가 사용하는 부분에 있어서 큰 요소인 것 같다. 그러니 상황에 맞게 잘 선택하여 사용하는 것이 중요하다!
구분자가 n개 이상이어도 모두 지우고, 원하는 문자열만 깔끔하게 얻고 싶다면 > split
구분자가 1개만 지워지지만, 나머지는 처리하고, 바로 반환되는 결과를 사용하고 싶다면 > components
이정도가 되지 않을까 싶다!