๊ธฐ์กด์ ์ด๋ ์ด์์ ๊ฐ์ ๋ณํ ์์ผ ์๋ก์ด ์ด๋ ์ด๋ฅผ ๋ฐํํ๋ ๊ฒ์ด -> 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)
๐ฅบ๐ฅฒ
)
์ด๋ ์ด ์์ ์ด๋ ์ด ์์ ์ด๋ ์ด ์์ ๊ฐ
์ด๋ฐ ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด ์์ด์
๊ณ ์ฐจ ํจ์๊ฐ ๋ง์ด ๋์์ด ๋ฌ๋๊ฑฐ ๊ฐ์์..๐
๋ฌธ์ ๋ ๊ถ๊ธํ๊ฑฐ ์์ผ์๋ฉด ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค!!!
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS/Xcode] Pod file not found ์ด์ (0) | 2023.03.23 |
---|---|
[Swift] FSCalendar ์ปค์คํ ์บ๋ฆฐ๋ ์ ๋ฆฌ (0) | 2023.03.16 |
[iOS/Swift] Dynamic Link ์ ๋ฆฌ (0) | 2023.03.08 |
[iOS/Swift] Firebase Remote Notification ์ ๋ฆฌ (0) | 2023.03.08 |
[iOS/Swift] Localization ์ฝ๋๋ก ๋ค๊ตญ์ด ์ฒ๋ฆฌ (0) | 2023.02.23 |
๋๊ธ