Old_SWIFT(221012)/함수이야기

<components>, <split> (글자 자르기)

KataRN 2021. 11. 10. 09:40
반응형

안녕하세요 KataRN입니다.

 

오늘은 String을 자르는 방법들에 대해 알아보려합니다.

&amp;amp;lt;오늘도 관련 있는듯 없는듯 한 사진&amp;amp;gt;

 

우선 크게 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를 사용하면 클로저로 활용이 가능해집니다.

 

오늘도 긴 글 읽어 주셔서 감사합니다.

나중에 추가적으로 도움이 될만한 응용예제가 있으면 추가하겠습니다.

감사합니다.

 

반응형