Search
Duplicate

map, flatMap, compactMap

생성일
2023/11/15 08:37
νƒœκ·Έ
Grammar

Β map, flatMap, compactMap

Swift에 map, flatMap, compactMap 은 λͺ¨λ‘ μ»¬λ ‰μ…˜ νƒ€μž…(ex, λ°°μ—΄, λ”•μ…”λ„ˆλ¦¬)에 μ‚¬μš©λ˜λŠ” κ³ μ°¨ ν•¨μˆ˜μ΄λ‹€.
이 ν•¨μˆ˜λ“€μ€ 각각의 μ»¬λ ‰μ…˜ μš”μ†Œμ— λŒ€ν•΄ νŠΉμ • 연산을 μˆ˜ν–‰ν•˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

Β map

map ν•¨μˆ˜λŠ” μ»¬λ ‰μ…˜μ˜ 각 μš”μ†Œμ— λŒ€ν•΄ 주어진 ν΄λ‘œμ €λ₯Ό μ μš©ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό μƒˆλ‘œμš΄ μ»¬λ ‰μ…˜μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.
β€’
이 ν•¨μˆ˜λŠ” 각 μš”μ†Œλ₯Ό λ³€ν™˜ν•  λ•Œ μ‚¬μš©ν•œλ‹€.
β€’
λ³€ν™˜λœ 각 μš”μ†ŒλŠ” ν΄λ‘œμ €μ˜ λ°˜ν™˜κ°’κ³Ό λ™μΌν•œ νƒ€μž…μ„ κ°€μ§‘λ‹ˆλ‹€.
μ˜ˆμ‹œ 1)
[1, 2, 3].map { $0 * 2 } // [2, 4, 6]
Swift
볡사
μ˜ˆμ‹œ 2)
let numbers: [Int] = [0, 1, 2, 3, 4, 5] print("numbers: \(numbers)") // numbers: [0, 1, 2, 3, 4 ,5] let mappingNumbers = numbers.map { number in number + 1 } print("mappingNumbers: \(mappingNumbers)") // mappingNumbers: [1, 2, 3, 4, 5, 6]
Swift
볡사
μΆ•μ•½)
let mappingNumbers = numbers.map { "λ‚˜λŠ” \($0)번 μž…λ‹ˆλ‹€." }
Swift
볡사

Β flatMap

Β Swift 4.1 이전
β€’
μ€‘μ²©λœ μ»¬λ ‰μ…˜(μ»¬λ ‰μ…˜μ˜ μ»¬λ ‰μ…˜)을 단일 μ»¬λ ‰μ…˜μœΌλ‘œ 평탄화(flatten) μ‹œν‚¨λ‹€.
β€’
map κ³Ό μœ μ‚¬ν•˜κ²Œ 각 μš”μ†Œμ— λŒ€ν•΄ ν΄λ‘œμ €λ₯Ό μ μš©ν•˜μ§€λ§Œ, ν΄λ‘œμ €κ°€ nil 을 λ°˜ν™˜ν•  수 μžˆλŠ” μ˜΅μ…”λ„ νƒ€μž…μ„ λ°˜ν™˜ν•  λ•Œ nil 값을 κ±ΈλŸ¬λ‚Έλ‹€.
Β Swift 4.1 이후
β€’
μ€‘μ²©λœ μ»¬λ ‰μ…˜μ„ ν‰νƒ„ν™”ν•˜λŠ” μš©λ„μ˜ flatMap은 compactMap으둜 λŒ€μ²΄λ˜μ—ˆλ‹€.

Β compactMap

μŠ€μœ„ν”„νŠΈ 4.1 μ΄μƒμ—μ„œ compactMap은 flatMap의 두 번째 μ‚¬μš© 사둀λ₯Ό λŒ€μ²΄ν•œλ‹€.
compactMap 은 각 μ»¬λ ‰μ…˜ μš”μ†Œμ— λŒ€ν•΄ ν΄λ‘œμ €λ₯Ό μ μš©ν•˜κ³ , ν΄λ‘œμ €κ°€ λ°˜ν™˜ν•˜λŠ” μ˜΅μ…”λ„ κ°’ μ€‘μ—μ„œ nil 이 μ•„λ‹Œ 값을 μΆ”μΆœν•˜μ—¬ μƒˆ μ»¬λ ‰μ…˜μ„ λ§Œλ“ λ‹€.
β†’ μ΄λŠ” 주둜 μ˜΅μ…”λ„μ„ λ°˜ν™˜ν•˜λŠ” λ³€ν™˜μ—μ„œ nil 값을 μ œκ±°ν•˜λŠ” 데 μœ μš©ν•˜λ‹€.
μ˜ˆμ‹œ)
["1", "two", "3"].compactMap { Int($0) } // [1, 3]
Swift
볡사
μ˜ˆμ‹œ 2)
let numbers: [[Int]] = [[0, 1, 2], [3, 4, 5], [6, 7, 8]] let mapNumbers = numbers.map { $0 } print("mapNumbers: \(mapNumbers)") // mpaNumbers: [[0, 1, 2], [3, 4, 5], [6, 7, 8]] let flatMapNumbers = numbers.flatMap { $0 } print("flatMapNumbers: \(flatMapNumbers)") // flatMapNumbers: [0, 1, 2, 3, 4, 5, 6, 7, 8] let compactMapNumbers = numbers.compactMap { $0 } print("compactMapNumbers: \(compactMapNumbers)") // compactMapNumbers: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
Swift
볡사
μ˜ˆμ‹œ 3)
let possibleNumbers = ["1", "2", "three", "///4///", "5"] let mapped = possibleNumbers.map { str in Int(str) } // [Optional(1), Optional(2), nil, nil, Optional(5)] let compactMapped = possibleNumbers.compactMap { str in Int(Str) } // [1, 2, 5]
Swift
볡사
β€’
map 을 μ‚¬μš©ν–ˆμ„ λ•ŒλŠ” optional μ΄μ§€λ§Œ,
β€’
compactMap 을 μ‚¬μš©ν•˜λ‹ˆ Int 에 ν•΄λ‹Ήν•˜λŠ” κ°’λ§Œ λ“€μ–΄κ°„λ‹€
β—¦
κ·Έ μ΄μœ λŠ” compactMap 이 μ˜΅μ…”λ„ λ°”μΈλ”©μ˜ κΈ°λŠ₯을 가지고 있기 λ•Œλ¬Έμ΄λ‹€.
β—¦
map 의 μ›λž˜ κΈ°λŠ₯μ—μ„œ μ˜΅μ…”λ„ μ œκ±°κΉŒμ§€ κ°€λŠ₯!

Β Reference

[Swift] 맡 μ‚Όν˜•μ œ(map, flatMap, compactMap)에 λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€
(1) map μ• ν”Œ 개발자 ν™ˆνŽ˜μ΄μ§€μ— μžˆλŠ” map에 λŒ€ν•œ μ„€λͺ…μž…λ‹ˆλ‹€. λ°°μ—΄ λ‚΄λΆ€μ˜ μš”μ†Œλ“€μ„ λ§€ν•‘ν•΄μ„œ λŒλ €μ€€λ‹€λ„€μš”! 그런데 mapping이 λ­˜κΉŒμš”? ꡬ글에 λ¬Όμ–΄λ΄…μ‹œλ‹€. μ—­μ‹œ λͺ…μΎŒν•˜λ‹€! ꡬ글! μ—¬κΈ° 말고 μ΄λ²ˆμ—λŠ” ν•΄μ‹œλ„·μ—μ„œ λ΄…μ‹œλ‹€(블둝체인 κ΄€λ ¨λœ 정보듀이 μ°Έ λ§ŽμŠ΅λ‹ˆλ‹€). μ•„κΉŒλ³΄λ‹¨ 훨씬 λ‚«μ£ ? κ·Έλž˜λ„ 이해가 잘 μ•ˆ 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œλ‘œ λ³΄μ‹œμ£ ! λ°”λ‘œ 감이 μ˜€μ‹œλ‚˜μš”? numbers λ°°μ—΄μ˜ 각 μš”μ†Œμ— 1을 λ”ν•œ 애듀을 배열에 λ‹΄μ•„ 보여 μ€λ‹ˆλ‹€. λ‹€λ₯Έ μ˜ˆμ‹œλ₯Ό ν•œ 번 λ“€μ–΄λ³ΌκΉŒμš”? μ•„κΉŒ μ‚¬μš©ν–ˆλ˜ numbersλ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λŠ”λ°, μ΄λ²ˆμ—λŠ” numbers λ‚΄λΆ€μ˜ 각 μš”μ†Œλ₯Ό String νƒ€μž…μœΌλ‘œ ν™œμš©ν•΄λ΄€μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ μΆ•μ•½ν•΄μ„œ μ“Έ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” ν•œ 번 μŠ€κΉŒμ„œ μ¨λ³ΌκΉŒμš”?? numbers의 각 μš”μ†Œμ— 3을 λ”ν•œ..