๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS

[Swift] ๊ณ ์ฐจ ํ•จ์ˆ˜ CompactMap

by ํ‹ด๋”” 2023. 3. 9.
728x90
๋ฐ˜์‘ํ˜•

๊ธฐ์กด์˜ ์–ด๋ ˆ์ด์—์„œ ๊ฐ’์„ ๋ณ€ํ˜• ์‹œ์ผœ ์ƒˆ๋กœ์šด ์–ด๋ ˆ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด -> map

์—ฌ๊ธฐ์— nil ๊ฐ’์„ ์ œ๊ฑฐํ•œ ๊ฒƒ์ด compactMap ์ž…๋‹ˆ๋‹ค

 

compactMap์ด ์ด์ œ๋Š” ๋„ˆ๋ฌด ๋ชธ์— ์ต์–ด๋ฒ„๋ ธ์ง€๋งŒ..

์ •๋ฆฌ์ฐจ์›์—์„œ ์‹ค์žฌ๋กœ ์–ด๋–ป๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ์„์ง€ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค!!

 

1. nil ์ œ๊ฑฐํ•˜๊ธฐ

let test = [1, 2, nil, 4, 5, nil]

let removedNilTest = test.compactMap { $0 }
[1, 2, 4, 5]

CompactMap์€ nil์„ ์ œ์™ธ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๋งŒ์•ฝ nil ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ํ•„์š”ํ•˜๋‹ค๋ฉด map์„ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค~

 

let sameWithAbove = test.compactMap { value in
    return value
}

๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋‹จ์ถ• ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ํ•œ ์ค„์— ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ด์„œ ์ข€๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์ง๊ด€์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ํ’€์–ด์„œ ์ ์–ด์ฃผ์‹œ๋Š”๊ฒŒ ์ข‹์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

 

2. ํŠน์ • ๊ฐ’ ์ถ”์ถœ

struct Car {
    let idx: Int
    let name: String?
}

let cars = [
    Car(idx: 0, name: "test1"),
    Car(idx: 1, name: "test2"),
    Car(idx: 2, name: nil)
]

print(cars.compactMap { $0.name })
["test1", "test2"]

๊ตฌ์กฐ์ฒด ์–ด๋ ˆ์ด์ธ ๊ฒฝ์šฐ ๊ตฌ์กฐ์ฒด์˜ ํŠน์ • ๊ฐ’์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์–ด์š”!

idx๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด $0.idx ๋กœ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ฃ ?

 

3. ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹

enum OptionType {
    case optional
    case required
}

struct Option {
    let idx: String?
    let optionName: String?
    let price: String?
    let type: OptionType
}

let options = [
    Option(idx: "0", optionName: "๋นจ๊ฐ•", price: "1000", type: .optional),
    Option(idx: "1", optionName: "๊ฒ€์ •", price: "2500", type: .required),
    Option(idx: "2", optionName: "ํŒŒ๋ž‘", price: "8000", type: .optional)
]

์ด ๊ตฌ์กฐ์ฒด๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฑฐ์—์š”!

 

(1) joined

let optionIdxs = options.compactMap { $0.idx }.joined(separator: ", ")
print(optionIdxs)
0, 1, 2

๐Ÿง‘‍๐Ÿ’ป ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž : ์„ ํƒ๋œ ์˜ต์…˜ ๊ฐ’๋“ค์˜ idx๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๋ณด๋‚ด์ฃผ์„ธ์š”~

์ด ์ƒํ™ฉ์—์„œ idx ๋งŒ ์ถ”์ถœํ•˜๊ณ  joined๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•˜๋‚˜์˜ String์œผ๋กœ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”

 

(2) sum

let optionPriceSum = options.compactMap { Int($0.price ?? "0") }.reduce(0, +)
11500

reduce๋„ ๊ณ ์ฐจ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค!

reduce๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋ ˆ์ด์˜ ๊ฐ’์˜ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์š”

reduce ์•ž๊นŒ์ง€๊ฐ€ [Int]์ด๊ณ  ์ด ์–ด๋ ˆ์ด์˜ ๊ฐ ์š”์†Œ์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด 

reduce(0, +)๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค

 

let sameWithAbove = options.compactMap { option in
    let price = option.price ?? "0"
    return Int(price)
}.reduce(0, +)

์œ„ ์ฝ”๋“œ๋ž‘ ๊ฐ™์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค~

 

4. ๊ฐ’ ํ•ธ๋“ค๋ง

let optionInfo = options.compactMap { "\($0.optionName ?? "(์—†์Œ)"): \($0.price ?? "0")"}.joined(separator: "\n")
๋นจ๊ฐ•: 1000
๊ฒ€์ •: 2500
ํŒŒ๋ž‘: 8000

๊ฐ’์„ ์กฐํ•ฉํ•ด์„œ ๋ฆฌํ„ดํ•ด ์ค„ ์ˆ˜๋„ ์žˆ์–ด์š”

๊ธฐ์กด ์–ด๋ ˆ์ด์—์„œ ์ƒˆ๋กœ์šด ๊ฐ’๋“ค์„ ๊ฐ€์ง„ ์–ด๋ ˆ์ด๋กœ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

 

let requireOptions = options.compactMap { $0.type == .required ? $0 : nil}
[Option(idx: Optional("1"), optionName: Optional("๊ฒ€์ •"), price: Optional("2500"), type: OptionType.required)]

ํŠน์ •ํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’๋งŒ ๋ฆฌํ„ดํ•ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”!

๋งŒ์•ฝ OptionType์ด required ์ธ ๊ฐ’๋งŒ ์–ด๋ ˆ์ด์— ํฌํ•จ ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค! ํ•œ๋‹ค๋ฉด

ํƒ€์ž…์„ ๋น„๊ตํ•œ ๋’ค required ๊ฐ’์„ ๊ฐ€์ง„ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด

์•„๋‹Œ ๊ฒฝ์šฐ nil ์„ ๋ฆฌํ„ด ํ•˜๋ฉด

compactMap์— ์˜ํ•ด nil์ด ์ œ์™ธ๋˜๊ณ  ์–ด๋ ˆ์ด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค

 

 


์ด๋ฒˆ์— ํ”„๋กœ์ ํŠธ ํ•˜๋ฉด์„œ 

nil๋กœ ์ ˆ๋Œ€ ์•ˆ์˜ค๊ฒ ๋‹ค๋Š” ๊ฐ’๋“ค์ด nil๋กœ ์™€์„œ ์˜ต์…”๋„ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ

map๋ณด๋‹ค๋Š” compactMap์ด ํŽธ๋ฆฌํ•˜๋”๋ผ๊ตฌ์š”

(

map์€ O(N)์ด๊ณ  
compactMap์€ O(M+N)

๐Ÿฅบ๐Ÿฅฒ

)

 

์–ด๋ ˆ์ด ์†์— ์–ด๋ ˆ์ด ์†์— ์–ด๋ ˆ์ด ์•ˆ์— ๊ฐ’

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ์–ด์„œ

๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ๋งŽ์ด ๋„์›€์ด ๋ฌ๋˜๊ฑฐ ๊ฐ™์•„์š”..๐Ÿ‘

 

 

๋ฌธ์ œ๋‚˜ ๊ถ๊ธˆํ•œ๊ฑฐ ์žˆ์œผ์‹œ๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!!!

 

https://www.pexels.com/ko-kr/photo/14968257/

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€