🍎 iOS & Swift

[iOS] λ°°μ—΄μ˜ κ³ μ°¨ ν•¨μˆ˜ - Higher Order Fuctions

taeeekki 2021. 7. 24. 17:33

Higher Order Function, μŠ€μœ„ν”„νŠΈ κ³ μ°¨ ν•¨μˆ˜

 

λ“€μ–΄κ°€κΈ° 전에

ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ‹€λ³΄λ©΄ λ°°μ—΄ κ·ΈλŒ€λ‘œλ₯Ό μ‚¬μš©ν•˜λŠ” 것 이외에도 데이터λ₯Ό ꡬ쑰에 맞게 λ³€ν˜•μ‹œμΌœμ„œ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. κ·ΈλŸ΄λ•Œλ§ˆλ‹€ μš°λ¦¬λŠ” 쑰건문을 μ΄μš©ν•΄ λΆ„κΈ°μ²˜λ¦¬λ₯Ό ν•˜κ±°λ‚˜ μ½”λ“œλ₯Ό μ œλ²• 길게 μž‘μ„±ν•΄μ„œ 배열을 μ²˜λ¦¬ν•˜κ³ λŠ” ν•˜λŠ”λ°μš”. μ € μ—­μ‹œλ„ 그런 κ²½μš°κ°€ λ§Žμ•˜μŠ΅λ‹ˆλ‹€.

 

μ΄λ²ˆμ— SOPTλΌλŠ” IT 벀처 μ°½μ—… λ™μ•„λ¦¬μ—μ„œ APPJAM μ΄λΌλŠ” 3μ£Όκ°„μ˜ 큰 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ μ€‘μš”ν•˜κ²Œ λŠλ‚€ 것 쀑 ν•˜λ‚˜λŠ” 배열에 λŒ€ν•œ 처리λ₯Ό 효율적으둜 μž˜ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

 

μ•„λž˜μ—μ„œ μ†Œκ°œν•˜λŠ” λ‚΄μš©μ—μ„œλŠ” 정말 μΌλΆ€λΆ„λ§Œ 닀룬 κ²ƒμΈλ°μš”. 이 μ—­μ‹œ Apple Develeoper 곡식 λ¬Έμ„œμ— 정말 μžμ„Έν•˜κ²Œ 잘 λ‚˜μ™€μžˆμŠ΅λ‹ˆλ‹€. (μ§„μ§œ 곡뢀λ₯Ό ν•˜λ©΄μ„œ λŠλΌλŠ” 것은 곡식 λ¬Έμ„œλ₯Ό 잘 읽자 인 것 κ°™λ„€μš”..γ…Žγ…Ž)

 

뭐 μ—¬νŠΌ! μ˜€λŠ˜μ€ λ°°μ—΄μ—μ„œ μ‚¬μš©λ˜λŠ” κ³ μ°¨ ν•¨μˆ˜ 5κ°€μ§€λ₯Ό μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ°°μ—΄μ˜ κ³ μ°¨ ν•¨μˆ˜ (Higher Order Fuction)

μ΄λ²ˆμ—λŠ” Array의 κ³ μ°¨ν•¨μˆ˜μ— λŒ€ν•œ ν•™μŠ΅μ„ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

map, reduce, filter, flatMap, compactMap

// MARK: - Custom Functions
extension ViewController {
    // Mark: - Map
    // - νŠΉμ • ν˜•νƒœλ‘œ λ³€ν™˜ν•΄μ„œ μš”μ†Œλ₯Ό λ°˜ν™˜
    private func executeMap() {
        let doubledNumbers = numbers.map { $0 * 2 }
        print(doubledNumbers)
    }
    // Mark: - Reduce
    // - μ΄ˆκΈ°μ›μ†Œλ₯Ό μ§€μ •ν•΄μ£Όκ³ , λ‚˜λ¨Έμ§€ μš”μ†Œλ₯Ό ν•©μ³μ„œ λ°˜ν™˜
    private func executeReduce() {
        let sum = numbers.reduce(0) { $0 + $1 }
        print(sum)
    }
    // Mark: - Filter
    // - 쑰건을 κ±Έμ–΄μ£Όκ³  True인 μš”μ†Œ λ°˜ν™˜
    private func executeFilter() {
        let even = numbers.filter { $0 % 2 == 0 }
        print(even)
    }
    // Mark: - CompactMap
    // - 배열에 nil 값이 μžˆλŠ” 경우, μ œμ™Έν•˜κ³  μš”μ†Œ λ°˜ν™˜
    private func executeCompactMap() {
        let compactMapArray = arrayWithNil.compactMap { $0 }
        print(compactMapArray)
    }
    // Mark: - FlatMap
    // - 2차원 배열을 1차원 λ°°μ—΄λ‘œ λ³€ν™˜
    // - nilκ°’ 제거 μœ„ν•΄μ„œλŠ” compactMap μ‚¬μš©
    // - flatMap, CompactMap은 1μ°¨μ›λ°°μ—΄μΌλ•Œλ§Œ nilκ°’ 제거
    private func executeFlatMap() {
        let flatMapArray = twoDimensionalArrayWithNil
            .flatMap { $0 }
            .compactMap { $0 }
        print(flatMapArray)
    }
}

Map

  • νŠΉμ • ν˜•νƒœλ‘œ λ³€ν™˜ν•΄μ„œ μš”μ†Œλ₯Ό λ°˜ν™˜

Reduce

  • μ΄ˆκΈ°μ›μ†Œλ₯Ό μ§€μ •ν•΄μ£Όκ³ , λ‚˜λ¨Έμ§€ μš”μ†Œλ₯Ό ν•©μ³μ„œ λ°˜ν™˜

Filter

  • 쑰건을 κ±Έμ–΄μ£Όκ³  True인 μš”μ†Œ λ°˜ν™˜

CompactMap

  • 배열에 nil 값이 μžˆλŠ” 경우, μ œμ™Έν•˜κ³  μš”μ†Œ λ°˜ν™˜

FlatMap

  • 2차원 배열을 1차원 λ°°μ—΄λ‘œ λ³€ν™˜
  • nilκ°’ 제거 μœ„ν•΄μ„œλŠ” compactMap μ‚¬μš©
  • flatMap, CompactMap은 1μ°¨μ›λ°°μ—΄μΌλ•Œλ§Œ nilκ°’ 제거

λ§ˆλ¬΄λ¦¬ν•˜λ©°

μ½”λ“œλ₯Ό 잘 μž‘μ„±ν•˜λŠ”(?!) μ‚¬λžŒλ“€μ˜ μ½”λ“œλ₯Ό 보면 κ·Έ 기쀀은 λͺ¨ν˜Έν•˜μ§€λ§Œ

기본적인 문법을 잘 μ‚¬μš©ν•˜λŠ” 것을 확인할 μˆ˜κ°€ μžˆμ–΄μš”...

λ‹¨μˆœνžˆ μ•Œκ³  μžˆλŠ” 것과 μ‚¬μš©μ„ ν•˜λŠ” 것은 큰 차이가 있죠!!

μš°λ¦¬λ„ 이제 μ•Œμ•˜μœΌλ‹ˆ 기쑴에 μž‘μ„±ν•œ μ½”λ“œλ₯Ό 잘 λ°”κΏ€ 수 μžˆλŠ”μ§€ 생각해보도둝 ν•©μ‹œλ‹€ πŸ™‚

 

더 μžμ„Έν•œ λ‚΄μš©μ€ 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄λ³΄μ‹œλ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€~!

 

κΉƒν—ˆλΈŒ

μ•„λž˜ λ§ν¬λŠ” κ°„λ‹¨ν•˜κ²Œ ν…ŒμŠ€νŠΈν•΄λ³Έ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

μ½”λ“œ μ°Έκ³ ν•˜μ‹œλ €λ©΄ μ•„λž˜ 링크둜 κ°€μ£Όμ„Έμš”!

https://github.com/Taehyeon-Kim/iOS-Wiki/tree/master/HigherOrderFunction