티스토리 뷰
안녕하세요 :) Zedd입니다.
오늘은 split에 대한 고찰..?을 써볼려고해요 :)
제목은 뭔가 거창해보이지만, 그냥 split을 궁금해하는 사람들(나..)을 위해 글을 씁니다 XD
사실 split은 우리 <String 쪼개기>글에서 배웠답니다.
시작할게요!!
split에 대한 고찰
<String 쪼개기>글을 읽고오셨다면, split이 어떤 메소드인지 알 수 있을거에요.
꼭 읽고오세요!
근데 뭘 고찰하냐;; 이건 이따가 말씀드릴게요!
먼저 split에는 크게 4가지의 경우의 수를 가집니다.
1. split(separator: Character)
바로 위 글에서 만나보았던 그런 형태죠?
var str = "Hello, world. Zedd!! Haha"
str.characters.split(separator: " ").map(String.init)
//Print ["Hello,", "world.", "Zedd!!", "Haha"]
(split은 꼭 map과 함께 써줘서 요소들을 String으로 만들어줘야지만 정상적으로? 출력이 된답니다.)
자.. 위 split은 separator로 " "(스페이스 하나)를 받고 그것을 기준으로 쪼개준 것 같네요.
이해가셨나요?
이것이 가장 기본적인 split이라고 할 수 있습니다.
두번째 경우의 수로 넘어갈게요.
2. split(separator: Character , maxSplits: Int)
자, 이번엔 separator가 나오긴 나왔는데, maxSplits라는 Int형 파라미터 하나를 받네요.
이건 뭘해주는 걸까요?
maxSplits? 최대 쪼개기..?
maxSplits의 정의를 한 번 볼까요?
maxSplit : 콜렉션을 분할하는 최대 횟수. 또는 반환 할 시퀀스 수(count)보다 적은 수. maxSplits은 0보다 크거나 같아야합니다. 기본값은 Int.max입니다.
그러니까!
간단히 생각하면 쪼개는 횟수라고 생각하시면 됩니다.
예제를 볼까요?
var str = "Hello, world. Zedd!! Haha"
str.characters.split(separator: " ", maxSplits: 1).map(String.init)
//Print ["Hello,", "world. Zedd!! Haha"] -> count = 2
자.. 출력은 이렇습니다.
주석의 count는 제가 이해를 돕기위해 넣었어요. :)
" "(공백)을 기준으로 쪼개줄건데, maxSplits이 1이니 한번만 쪼개줘!!가 되는거죠.
그러니까 처음만나는 Hello, 뒤에있는 공백을 만나고 한번 쪼갠 뒤, 이제 안쪼개는 겁니다.
maxSplits에 0을 넣으면 안쪼개겠죠?
var str = "Hello, world. Zedd!! Haha"
str.characters.split(separator: " ", maxSplits: 0).map(String.init)
//Print ["Hello, world. Zedd!! Haha"] -> count = 1
이렇게요.
자, 세번째 경우의 수로 넘어갈게요!
3. split(separator: Character, omittingEmptySubsequences: Bool)
오..조금 길어졌네요.
역시나 separator를 받고, 이번엔 omittingEmptySubsequences이라는 Bool형을 파라미터로 받습니다.
처음에 이걸보고, 엥...했던 기억이 있네요 :)
omittingEmptySubsequences. 직독직해 ㄱ
omitting/Empty/Subsequences가 될 것 같은데..
그렇다면, omittingEmptySubsequences은 생략하다/빈/시퀀스 가 되겠네요!!11
네.....Zedd식 해석을 보았구요.....진짜 Apple식 해석을 볼까요?
omittingEmptySubsequences : false의 경우 separator의 인스턴스마다 결과에 빈(empty) 서브 시퀀스를 돌려줍니다. true의 경우, 비어있지 않은(non-empty)서브 시퀀스만 반환됩니다. 기본값은 true입니다.
네 역시 직독직해가 짱이었습니다.
이걸 구구절절 설명하기보다는 예제를 보시면 한번에 이해가 가실겁니다.
1. omittingEmptySubsequences = false
var str = "Hello, world. Zedd!! Haha"
str.characters.split(separator: " ", omittingEmptySubsequences: false).map(String.init)
//Print ["Hello,", "world.", "Zedd!!", "", "", "Haha"]
false일때는 빈 시퀀스가 역시 포함되어서 반환되네요. 여기서 헷갈리면 안되는 것이. 빈 시퀀스입니다.
"(공백 하나)"는 빈 시퀀스가 아닌 것을 주의하세요.
결과에서도 볼 수 있듯이 " "가 아니라 ""이 반환된 것을 볼 수 있습니다.
여기서 split이 어떻게 되는지 말씀드리자면,
split은 처음 Hello,를 만나고 공백하나를 만나게 됩니다.
separator가 공백하나였으니, 이 공백을 기준으로 한번 쪼개주게 되죠.
world.를 만나고도 역시 공백을 하나 만나므로, 쪼개주게 됩니다.
마지막으로,
"Zedd!! Haha"
Zedd!!를 만나고 "처음에는" 공백하나를 만나기 때문에 쪼개줍니다.
하지만 이 공백하나 뒤에는 공백 2개가 더 있죠.
"Zedd!! Haha"
자, 또 공백을 만났네요. 여기서 한번 쪼개주겠죠? 하지만 이 안에는 아무 글자가 없기때문에 ""가 리턴될거에요.
"Zedd!! Haha"
마지막 공백을 만났습니다. 또 한번 쪼개겠네요. 역시나 아무 글자가 없기때문에, ""가 리턴될 것입니다.
정말 마지막으로 Haha를 만나고 문장이 끝났기 때문에 split은 최종적으로
["Hello,", "world.", "Zedd!!", "", "", "Haha"]
를 리턴합니다.
이제 왜 Zedd!!와 Haha사이에 ""가 2번 나왔는지 이해가시나요?
1. omittingEmptySubsequences = true
var str = "Hello, world. Zedd!! Haha"
str.characters.split(separator: " ", omittingEmptySubsequences: true).map(String.init)
//Print ["Hello,", "world.", "Zedd!!", "Haha"]
true일때는 위에서 나왔던 ""이 빠진 결과를 볼 수 있네요.
omitting/Empty/Subsequences = true
생략할거니/ 빈 / 시퀀스 = 응~!
이니까요!
마지막 경우의 수는
4. split(separator: Character, maxSplits: Int, omittingEmptySubsequences: Bool)
위에서 나온 maxSplits과 omittingEmptySubsequences이 전부 다 들어가있죠?
ㅎㅎ
var str = "Hello, world. Zedd!! Haha"
str.characters.split(separator: " ", maxSplits: 3, omittingEmptySubsequences: false).map(String.init)
자.. 우리 위에서 전부 다 배웠죠? 위 코드의 결과는 어떻게될까요?
일단 separator는 " "고..maxSplits가 3이네요. omittingEmptySubsequences이 false이니 빈 시퀀스를 받겠다는 거죠? 빈 시퀀스가 결과배열에 들어갈 수 있습니다.
한번 같이 해볼까요?
"Hello, world. Zedd!! Haha"
Hello, (공백 만남) --> 결과 ["Hello," , "world. Zedd!! Haha"]
world. (공백만남) --> 결과 ["Hello,", "world.","Zedd!! Haha"]
Zedd!! (공백만남) --> 결과 ["Hello,", "world.", "Zedd!!" ," Haha"]
자 이제 maxSplit이 3이었으니 이제 더이상 쪼갤 수 없습니다.
눈여겨볼만한 점은 " Haha"부분입니다. 왜 앞에 Haha앞에 공백 2개가 있는지 아시겠죠?
omittingEmptySubsequences이 true였다고해도 maxSplits이 3이기 때문에
결과는
["Hello,", "world.", "Zedd!!" ," Haha"]로 똑같습니다.
자 이렇게 모든 경우의 split을 같이 봤는데, 이해가시나요? ㅎㅎ
잘 모르시겠다! 또는 지적할 점 등이 있다면, 댓글이나 PC화면 오른쪽 하단에 있는 채널서비스를 이용해주세요 :)
5분안에는 반드시 확인할게요 :)
보통? 1번 split만 쓰실거에요. 그래도 우리가 원하는 공백이 전부 빠져있는 결과가 나오는 이유는 maxSplits은 기본값이 Int.max이며, omittingEmptySubsequences도 true로 설정이 되어있으니까요!
ㅎㅎㅎ사실 이런것들이 궁금해서 이 글을 쓰게됐어요! split에 대한..고찰..맞죠?
components로는 할 수 없는 것들을 split으로는 할 수 있죠?
< components와 split 차이 >글을 보시면 알 수 있답니다 :) 이것때문에 제가 좀 고생했었죠..
여러분들도 이런 여러가지 파라미터를 사용해서 원하는 배열을 리턴받으셨으면 좋겠어요 :)
모르고 쓰는 것 보다는 알고쓰면 좋자나요!!!
오늘도 도움이 되었으면 좋겠어요 XD
'Swift' 카테고리의 다른 글
Swift ) tuple (3) | 2017.10.02 |
---|---|
Swift ) Types (0) | 2017.10.01 |
함수(Function) VS 메소드(Method) (3) | 2017.09.26 |
Swift ) Generic (7) | 2017.09.22 |
Swift ) Equatable (4) | 2017.09.18 |
- swift 공부
- Swift
- np-hard
- WWDC
- Combine
- 피아노
- np-complete
- fastlane
- SwiftUI
- swift tutorial
- FLUTTER
- WidgetKit
- Accessibility
- 회고
- iOS delegate
- IOS
- Git
- 스위프트
- github
- swift array
- 제이슨 파싱
- ios 13
- swift delegate
- actor
- Xcode
- WKWebView
- UIBezierPath
- swift sort
- swift3
- 스위프트 문법
- Total
- Today
- Yesterday