๐Ÿ“’ Study/๐Ÿšฉ Swift

[ Swift ] split ๊ณผ components

EarthSea 2024. 3. 22. 10:49

 

 

์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ split๊ณผ components์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

split์™€ components๋Š” ๋ฌธ์ž์—ด์„ ํŠน์ • ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด ๋ฌธ๋ฒ•์ด์—์š”.

์šฐ์„  split์™€ components์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์ „์— ๊ฐ๊ฐ์˜ ์ •์˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์˜ ์—ญํ• ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค.

 

Split

func split(
    separator: String,
    maxSplits: Int = .max,
    omittingEmptySubsequences: Bool = true
) -> [Substring]

 

split๋Š” Swift Standard Library ์— ํฌํ•จ์ด ๋˜์–ด์žˆ์–ด์„œ, import ์—†์ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค!

split๋Š” separatormaxSplitsomittingEmptySubsequences ๋ผ๋Š” 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