안녕하세요 KataRN입니다.
오늘은 String을 자르는 방법들에 대해 알아보려합니다.
우선 크게 2가지가 있습니다.(알아본게 2개라는뜻입니다. 더있을지도...)
1. components(separatedBy:)
Returns an array containing substrings from the receiver that have been divided by a given separator.
func components(separatedBy separator: String) -> [String]
흠 string을 넣으면 배열안에 string을 넣어서 돌려받게 생겼네요?예제로 확인해보겠습니다.
var str = "Hello, My name is Pane, Go to Hell"
var slice = str.components(separatedBy: " ")
print(slice)
나온 결과는?
["Hello,", "My", "name", "is", "Pane,", "Go", "to", "Hell"]
그렇습니다. " " 띄어쓰기를 기준으로 다 잘라버렸습니다.(슥삭쇽)
하지만 쉼표가 같이 들어가있어서 거슬리네요... ㅂㄷㅂㄷ
방법이 있겠죠? 남들이 하면 나도 할 수 있다는 마인드로(남들이 했는지는 모르지만) 하면 됩니다.
var str = "Hello, My name is Pane, Go to Hell"
var slice = str.components(separatedBy: [",", " "])
print(slice)
이렇게 하면 여러가지 문자들을 한번에 가능합니다.
다만 이렇게 실행하면...
["Hello", "", "My", "name", "is", "Pane", "", "Go", "to", "Hell"]
이렇게 나오네요... 언짢...
걱정하지마세요 방법은 많으니까... 코드가 더러워질 뿐...
일단 배열로 값이 나오는것을 주목하도록 하죠.
이말은 값이 없는 값들을 빼주면 된단 소리겠죠?
아직 제 블로그에서 언급하지 않은 추론을 통해서 코드를 보강하겠습니다.
var str = "Hello, My name is Pane, Go to Hell"
var slice = str.components(separatedBy: [",", " "]).filter{!$0.isEmpty}
print(slice)
결과는 ? ["Hello", "My", "name", "is", "Pane", "Go", "to", "Hell"]
만족스럽군요. 짝짝짝
다음으로 넘어갑니다~
2. split(separator:maxSplits:omittingEmptySubsequences:)
Returns the longest possible subsequences of the collection, in order, around elements equal to the given element.
평소 제가 알던 split가 아닌데... 머지... 싶으신 분들 꼭 읽어주세요.
공식 문서 기준으로 예제를 보겠습니다.
let line = "BLANCHE: I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"
print(line.split(separator: " ", maxSplits: 1))
// Prints "["BLANCHE:", " I don\'t want realism. I want magic!"]"
print(line.split(separator: " ", omittingEmptySubsequences: false))
// Prints "["BLANCHE:", "", "", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"
보통 split함수 안에 separator만 넣어서 쓰는데 maxSplits와 omittingEmptySubsequences 2가지가 더있네요?
이게 무엇이냐 하면...
maxSplits : Int = 최대 몇번 나누기를 할거니?
omittingEmptySubsequences : Bool = 공백 포함 하싈?(띄어쓰기 아닙니다~)
자 여기까지 보셨는데 설마 1.components와 2.split의 차이점이 궁금하신 분은 없으실거라 생각하지만...
혹시모르니 예제를 통해 설명하겠습니다.(절대 글의 양을 늘리기 위해서가 아닙니다..)
<맨 앞과 맨 뒤는 한칸씩, 가운데는 2칸씩 띄어쓰기를 하였습니다.>
var str = " Hello My name is Pane "
var components1 = str.components(separatedBy: " ")
var split1 = str.split(separator: " ")
var split2 = str.split(separator: " ", omittingEmptySubsequences: false)
print("components1 : \(components1)")
print("split1 : \(split1)")
print("split2 : \(split2)")
결과는?
components1 : ["", "Hello", "", "My", "", "name", "", "is", "", "Pane", ""]
split1 : ["Hello", "My", "name", "is", "Pane"]
split2 : ["", "Hello", "", "My", "", "name", "", "is", "", "Pane", ""]
확실히 차이점들이 보이네요.
제 생각에는 split는 좀더 결과물을 조정할 수 있네요.
(split 함수에서 omittingEmptySubsequences는 디폴트가 true인것 같습니다.)
...... 하하... 여기까지만 쓰면 사실 제 블로그 오시라고 못하죠...
그래서 예제 하나 더 준비했습니다.
var str = "Hello, My name is Pane, Go to Hell"
var split1 = str.split(whereSeparator: {$0 == " " || $0 == ","})
print(split1)
결과는?
["Hello", "My", "name", "is", "Pane", "Go", "to", "Hell"]
후후...
separator이 아니라 whereSeparator를 사용하면 클로저로 활용이 가능해집니다.
오늘도 긴 글 읽어 주셔서 감사합니다.
나중에 추가적으로 도움이 될만한 응용예제가 있으면 추가하겠습니다.
감사합니다.
'Old_SWIFT(221012) > 함수이야기' 카테고리의 다른 글
<Filter> 함수 더하기 추론(조금...) (0) | 2021.11.12 |
---|---|
<Map> 함수 더하기 추론<조금>, <compactMap>, <flatMap> (0) | 2021.11.12 |
<replacingOccurrences> (문자 변환) (0) | 2021.11.08 |
<enumarated> 함수 (0) | 2021.11.08 |
<zip> 함수 (0) | 2021.11.08 |