์๋ ํ์ธ์! ์ค๋์ split๊ณผ components์ ์ฐจ์ด์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
split์ components๋ ๋ฌธ์์ด์ ํน์ ๋ฌธ์์ด์ ๊ธฐ์ค์ผ๋ก ๋๋ ์ ์๋ ๋ฌธ์์ด ๋ฌธ๋ฒ์ด์์.
์ฐ์ split์ components์ ์ฐจ์ด๋ฅผ ๋น๊ตํ๊ธฐ ์ ์ ๊ฐ๊ฐ์ ์ ์์ ๋งค๊ฐ๋ณ์๋ค์ ์ญํ ์ ์ดํด๋ด ์๋ค.
Split
func split(
separator: String,
maxSplits: Int = .max,
omittingEmptySubsequences: Bool = true
) -> [Substring]
split๋ Swift Standard Library ์ ํฌํจ์ด ๋์ด์์ด์, import ์์ด๋ ์ฌ์ฉํ ์ ์๋ ๋ฌธ๋ฒ์ ๋๋ค!
split๋ separator
, maxSplits
, omittingEmptySubsequences
๋ผ๋ 3๊ฐ์ง ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๊ณ Substring ๋ฐฐ์ด๋ก ์ถ๋ ฅ์ ํด์.
separator
์ฌ๊ธฐ์ separator
์ ์ญํ ์ ๋ฌธ์์ด์ ๋๋๋ ๊ธฐ์ค์ด ๋๋ ์์์
๋๋ค. ํ์
์ String
์ด์ฃ .
let str:String = "์๋
ํ์ธ์__ ์ ๋ ์ฃผ๋์ด__ ๊ฐ๋ฐ์ ์งํด์
๋๋ค__"
str.split(separator: " ")
// result : ["์๋
ํ์ธ์__", "์ ๋", "์ฃผ๋์ด__", "๊ฐ๋ฐ์", "์งํด์
๋๋ค__"]
str.split(separator: "__")
// result : ["์๋
ํ์ธ์", " ์ ๋ ์ฃผ๋์ด", " ๊ฐ๋ฐ์ ์งํด์
๋๋ค"]
์์ ์์๋ฅผ ํตํด ๋น ๋ฌธ์์ด์ธ " "๋ฅผ ํตํด์๋ ๋ฌธ์์ด ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ณ , ํ ๊ฐ์ ๋ฌธ์๊ฐ ์๋ ๋ฌธ์์ด "__"๋ฅผ ํตํด์๋ ๋ฌธ์์ด ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ ๊ฒ์ ๋ณผ ์ ์์ด์. ๊ฒฐ๊ณผ๋ ๋ฌธ์์ด ๋ฐฐ์ด๋ก ์ถ๋ ฅ์ด ๋ฉ๋๋ค.
maxSplits
maxSplits
๋ ๋ฌธ์์ด์ ์์์๋ถํฐ ๋ช ๋ฒ ๋ถ๋ฆฌํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋งค๊ฐ๋ณ์์
๋๋ค. ๋ฐ๋ผ์ ์ต์ข
์ ์ผ๋ก ๋ถ๋ฆฌ๋๋ ๋ฌธ์์ด์ maxSplits+1 ๊ฐ๊ฐ ๋๋ ๊ฒ์ด์ฃ ! Int ํ์
์ผ๋ก ๋ฐ๊ณ ์์ด์!
str.split(separator: "__", maxSplits: 0)
// result : ["์๋
ํ์ธ์__ ์ ๋ ์ฃผ๋์ด__ ๊ฐ๋ฐ์ ์งํด์
๋๋ค__"]
str.split(separator: "__", maxSplits: 1)
// result : ["์๋
ํ์ธ์", " ์ ๋ ์ฃผ๋์ด__ ๊ฐ๋ฐ์ ์งํด์
๋๋ค__"]
str.split(separator: "__", maxSplits: 2)
// result : ["์๋
ํ์ธ์", " ์ ๋ ์ฃผ๋์ด", " ๊ฐ๋ฐ์ ์งํด์
๋๋ค__"]
str.split(separator: "__", maxSplits: 3)
// result : ["์๋
ํ์ธ์", " ์ ๋ ์ฃผ๋์ด", " ๊ฐ๋ฐ์ ์งํด์
๋๋ค"]
str.split(separator: "__", maxSplits: 10)
// result : ["์๋
ํ์ธ์", " ์ ๋ ์ฃผ๋์ด", " ๊ฐ๋ฐ์ ์งํด์
๋๋ค"]
์ฒซ ๋ฒ์งธ ์ฝ๋์ ๋ง์ง๋ง ์ฝ๋๋ฅผ ์ดํด๋ณด์๋ฉด maxSplits ๊ฐ 0์ด์ด๋, "__" ์ด ํ์ฌ ๋ฌธ์์ด์ ์๋ ๊ฐ์๋ฅผ ์ด๊ณผํ๋๋ผ๋ ์คํ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์. ๋ํ ์์์ ๋งํ ์ต์ข ์ ์ผ๋ก ๋ถ๋ฆฌ๊ฐ ๋๋ ๋ฌธ์์ด์ด maxSplits+1 ๊ฐ ๋ผ๋ ๋ง์ maxSplits ๊ฐ 1์ผ ๋๋ ์ ค ์ฒซ๋ฒ์งธ ๋ฐ๊ฒฌ์ด ๋๋ "__" ๋ฌธ์์ด๋ก ๋ถ๋ฆฌ๊ฐ ๋ ๋ค์์ ๋๋จธ์ง๋ ๋ถ๋ฆฌ๊ฐ ๋์ง ์์ฃ ?! ๊ทธ๋ฌ๋ ์ต์ข ์ ์ธ ๋ฌธ์์ด ๋ฐฐ์ด์ ๊ฐ์๋ 2๊ฐ๊ฐ ๋๋ค๋ ๋ง์ ๋๋ค.
omittingEmptySubsequences
omittingEmptySubsequences
๋ ๋ฌธ์์ด์ ๋ถ๋ฆฌํ์ฌ ์ถ๋ ฅํ ๋, "" ๋น ๋ฌธ์์ด์ ํฌํจํ ์ง ํฌํจํ์ง ์์์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋งค๊ฐ๋ณ์์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ผ๋ก true
๊ฐ ์
๋ ฅ๋์ด ์์ด์, ์์ ์์๋ค๊ณผ ๊ฐ์ด omittingEmptySubsequences ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ํ์ง ์์์ ๊ฒฝ์ฐ์ "" ๋น๋ฌธ์์ด์ ํฌํจํ์ง ์๊ณ , ์ถ๋ ฅ์ ํด์.
str.split(separator: "__", omittingEmptySubsequences: false)
// result : ["์๋
ํ์ธ์", " ์ ๋ ์ฃผ๋์ด", " ๊ฐ๋ฐ์ ์งํด์
๋๋ค", ""]
str.split(separator: "__", omittingEmptySubsequences: true)
// result : ["์๋
ํ์ธ์", " ์ ๋ ์ฃผ๋์ด", " ๊ฐ๋ฐ์ ์งํด์
๋๋ค"]
์์ ์์์ ๊ฐ์ด omittingEmptySubsequences ๋ฅผ false๋ก ์ ๋ ฅํ์ ๋์ true๋ก ์ ๋ ฅํ์ ๋์ ์ฐจ์ด๊ฐ ๋๊ปด์ง์๋์?
๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ๋ณด๋ฉด "" ๋น ๋ฌธ์์ด์ด ํฌํจ์ด ๋๋์ง ์๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์ข ๋ ๋ค์ํ ์์๋ฅผ ์ดํด๋ณด์๋ฉด, ๋ฌธ์์ด ๊ณต๋ฐฑ์ ๋ ์นธ์ฉ ๋์์ ๋์ ๋๋ค.
let str2:String = "์๋
ํ์ธ์ ์ ๋ ์ด๋ณด ๊ฐ๋ฐ์ ์งํด์
๋๋ค"
str2.split(separator: " ", omittingEmptySubsequences: true)
// result : ["์๋
ํ์ธ์", "์ ๋", "์ด๋ณด", "๊ฐ๋ฐ์", "์งํด์
๋๋ค"]
str2.split(separator: " ", omittingEmptySubsequences: false)
// result : ["์๋
ํ์ธ์", "", "์ ๋", "", "์ด๋ณด", "", "๊ฐ๋ฐ์", "", "์งํด์
๋๋ค"]
false๋ฅผ ํ๋ค๋ฉด " "" " ๋น ๋ฌธ์์ด๊ณผ ๋น ๋ฌธ์์ด๋ ๋๋๊ธฐ ๋๋ฌธ์, ๊ทธ ์ฌ์ด์ ""์ด๋ฐ ๊ณต๊ฐ๋ ์ถ๋ ฅ์ ํ๋ ๊ฑฐ์ฃ .
์ด์ components์ ๋ํด์๋ ์์๋ณผ๊น์?
Components
func components(separatedBy separator: CharacterSet) -> [String]
components ๋ Foundation ํ๋ ์์ํฌ์ ์ํด ์๊ธฐ ๋๋ฌธ์ Foundation์ importํด์ผ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
components ๋ separatedBy
๋ผ๋ ํ ๊ฐ์ง์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๊ณ , String
๋ฐฐ์ด๋ก ์ถ๋ ฅ์ ํฉ๋๋ค.
separatedBy
separatedBy
๋ split์ separator์ ์ญํ ๊ณผ ๋์ผํ๊ฒ ๋ฌธ์์ด์ ๋๋๋ ๊ธฐ์ค์ด ๋๋ ์์์
๋๋ค. ํ์ง๋ง, split์ ๋ค๋ฅด๊ฒ CharacterSet
์ผ๋ก ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
let str:String = "์๋
ํ์ธ์__ ์ ๋ ์ฃผ๋์ด__ ๊ฐ๋ฐ์ ์งํด์
๋๋ค__"
str.components(separatedBy: " ")
// result : ["์๋
ํ์ธ์__", "์ ๋", "์ฃผ๋์ด__", "๊ฐ๋ฐ์", "์งํด์
๋๋ค__"]
str.components(separatedBy: "__")
// result : ["์๋
ํ์ธ์", " ์ ๋ ์ฃผ๋์ด", " ๊ฐ๋ฐ์ ์งํด์
๋๋ค", ""]
split์ ๊ฐ์ด ๋น ๋ฌธ์์ด์ธ " "๋ฅผ ํตํด์๋ ๋ฌธ์์ด ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ณ , ํ ๊ฐ์ ๋ฌธ์๊ฐ ์๋ ๋ฌธ์์ด "__"๋ฅผ ํตํด์๋ ๋ฌธ์์ด ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง, components๋ ๋ง์ง๋ง์ "" ๋น ๋ฌธ์์ด๊น์ง ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
let str2:String = "์๋
ํ์ธ์ ์ ๋ ์ฃผ๋์ด ๊ฐ๋ฐ์ ์งํด์
๋๋ค"
str2.components(separatedBy: " ")
// result : ["์๋
ํ์ธ์", "", "์ ๋", "", "์ฃผ๋์ด", "", "๊ฐ๋ฐ์", "", "์งํด์
๋๋ค"]
์์ ์์๋ฅผ ๋ณด๊ณ , ๋ ํ์คํ๊ฒ ์ ์ ์์ฃ ?
components๋ split์ omittingEmptySubsequences๊ฐ false๋ก ์ถ๋ ฅํ์ ๋์ ๋์ผํฉ๋๋ค.
์ด์ ๋ ๋ฌธ๋ฒ์ ์ฐจ์ด์ ๋ํด์ ์ ๋ฆฌํด๋ณผ๊น์?
Split์ Components์ ์ฐจ์ด
Split | Components | |
Foundation์ ํ์ ์ฌ๋ถ | X | O |
๋งค๊ฐ๋ณ์์ ๊ฐ์ | 3 | 1 |
๋ถ๋ฆฌํ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์ | separator | separatedBy |
ใด ํ์ | String | CharacterSet |
๋ถ๋ฆฌํ๋ ๋ฌธ์์ด์ ๊ฐ์๋งค๊ฐ๋ณ์ | maxSplits | x |
๋น๋ฌธ์์ด("") ์ถ๋ ฅ ์ฌ๋ถ | ์ ํ๊ฐ๋ฅ( ๊ธฐ๋ณธ ๊ฐ์ X ) | O |
์ถ๋ ฅ ํ์ | [Substring] | [String] |
์๊ฐ ๋ณต์ก๋ | O(n) | O(n) |
์ด์ ์ฌ๊ธฐ์ ์ค์ํ๊ฒ ์๊ฐํด์ผ๋ ๋ถ๋ถ์ด ์ฑ๋ฅ์ด์์!
์์์ ์ค๋ช ํ๋๋ก
omittingEmptySubsequences
์ ์ฌ๋ถ๊ฐ ์ฑ๋ฅ์ฐจ์ด๋ฅผ ๋ง๋ค์ด๋
๋๋ค.
let comparison = "์๋
ํ์ธ์ ์ ๋ ์งํด์์. "
comparison.split(separator: " ")
// result : ["์๋
ํ์ธ์", "์ ๋", "์งํด์์."]
comparison.components(separatedBy: " ")
// result : ["์๋
ํ์ธ์", "์ ๋", "์งํด์์.", "", "", "", "", "", "", "", "", "", "", ""]
split๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋น ๋ฌธ์์ด("")์ ์ถ๋ ฅํ์ง ์๋๋ก ํ๊ธฐ๋๋ฌธ์, ๋ฌด์กฐ๊ฑด ๋น๋ฌธ์์ด("")์ ์ถ๋ ฅํ๋ components๋ณด๋ค ์ฑ๋ฅ์ด ๋ ๋น ๋ฅด๊ฒ ์ฃ ?
References
๐ ์ด ๊ฒ์๊ธ์ @yuuuye๋์ velog๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค
https://velog.io/@folw159/Swift-components์-split์-์ฐจ์ด#references
๐ apple์ ๊ณต์ ๋ฌธ์
https://developer.apple.com/documentation/swift/stringprotocol/components(separatedby:)-4j26n
https://developer.apple.com/documentation/swift/stringprotocol/split(separator:maxsplits:omittingemptysubsequences:)-7mfus