블로그 이미지

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 15. Higher-order function 고차함수 기초 (map, filter, reduce)
    Programming Language/Swift 2022. 6. 5. 09:06

    Swift의 고차함수 map, filter, reduce를 알아보자.

    Swift를 사용하는 개발자라면 고차 함수는 꼭 알고 있어야 한다. Swift는 함수를 일급 객체로 취급하기 때문에, 함수를 다른 함수의 전달인자로 취급할 수 있다.

     

    Higher-order function은 인자로 하나 이상의 함수를 받거나 함수를 리턴하는 함수다.

    map

    map은 컨테이너가 담고 있는 모든 요소에 자신이 받은 함수를 적용한 뒤 업데이트 된 컨테이너를 반환한다. 즉 기존 데이터를 변형하는데 많이 사용한다. 기존 컨테이너의 값은 변하지 않고, 값이 업데이트된 새로운 컨테이너가 반환된다.

     

    Swift에서 map은 배열, 딕셔너리, 집합, 옵셔널 등에 사용할 수 있다. Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 map을 사용할 수 있다.

     

    map은 컨테이너 내의 모든 요소에 한 번씩 접근해서 함수를 수행한다는 점에서 for-in 문과 비슷하다. 하지만 코드의 재사용, 컴파일러 최적화 면에서는 차이가 있다. 또한 멀티 스레드 환경에서 컨테이너 값이 한 스레드에서 변경될 때 다른 스레드에서도 동시에 값이 변경되려고 할 때 예상하지 못한 결과가 발생하는 것을 방지할 수도 있다.

    // 1
    let coins = [1, 5, 2, 10, 6]
    
    // 2
    var coinsWithCurrency: [String] = []
    for coin in coins {
        coinsWithCurrency.append("\(coin)$")
    }
    print(coinsWithCurrency)
    
    // 3
    let coinsWithCurrencyUsingMap = coins.map { (coin) -> String in
        "\(coin)$"
    }
    print(coinsWithCurrencyUsingMap)
    
    // 4
    let coinsWithCurrencyUsingMap_shortSyntax = coins.map { "\($0)$" }
    print(coinsWithCurrencyUsingMap_shortSyntax)

    map을 사용하면 코드가 간결해질 뿐만 아니라 새로운 배열을 위해 처음에 빈 배열을 따로 만드는 작업도 필요가 없다.

    filter

    filter는 컨테이너의 모든 요소를 돌면서 filter의 body의 조건을 만족하는 요소들만을 담은 컨테이너를 반환한다. 즉 컨테이너 내부의 값을 거르는 고차함수다.

    // 1
    let coins = [1, 5, 2, 10, 6, 2, 7, 4, 10, 15]
    
    // 2
    let coinsWithValueLessThanSix = coins.filter { (coin) -> Bool in
        coin < 6
    }
    print(coinsWithValueLessThanSix)
    
    // 3
    let coinsWithValueLessThanSixShortSyntax = coins.filter { $0 < 6 }
    print(coinsWithValueLessThanSixShortSyntax)

    reduce

    reduce는 컨테이너 내의 모든 요소들을 돌면서 모든 요소들의 결합된 값을 리턴한다. 즉 컨테이너 내부의 콘텐츠를 하나로 합치는 고차함수다.

    func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

    좀 더 간단히 표현하면 reduce(초기result, (현재result, 현재element) -> 최종result)다.

    
    // 1
    let coins = [1, 5, 2, 10, 6, 2, 7, 4, 10, 15]
    
    // 2
    let sumOfCoins = coins.reduce(0) { (result, coin) -> Int in
        result + coin
    }
    print(sumOfCoins)
    
    // 3
    let sumOfCoinsShortSyntax = coins.reduce(0, { $0 + $1 })
    print(sumOfCoinsShortSyntax)

     

     

    • 출처
     

    Higher Order Functions in Swift

    forEach, map, CompactMap, flatMap, filter, reduce, sort, and sorted

    levelup.gitconnected.com

     

    반응형

    댓글

Designed by Tistory.