iOS/Swift

Reduce, Map, Filter

누알라리 2021. 3. 28. 15:07

개요

swift는 함수를 1급 객체로 사용하는 고차함수(Higher-Order-Function)를 Foundation 라이브러리에서 제공하고 있습니다.

대표적으로 Filter, Map, Reduce가 있습니다.

 

Filter

클로저로 배열의 각 항목들을 비교하여 일치하는 결과물을 가진 새로운 배열을 반환한다.

 

// Declaration
func filter(includeElement: (T) -> Bool) -> Array<T>

문제)

배열의 짝수를 리턴하는 filter문을 만드세요.

 

답)

let newArr = oldArr.filter( {(num: Int) -> Bool in return num%2 == 0})
let newArr = oldArr.filter { $0%2 == 0 }

Reduce

배열의 각 항목들을 재귀적으로 클로저를 적용시켜 하나의 값을 반환한다.

 

// Declaration
func reduce<U>(initial: U, combine: (U,T) -> U) -> U

문제)

reduce로 리팩토링 해보세요~

func sloution(_ nums: [Int]) -> Int {
    var result = 0
    for i in nums {
    	result += i
    }
	return result
}

답)

func solution(_ nums: [Int]) -> Int {
    return nums.reduce(0, {(s1:Int, s2:Int) -> Int in return s1+s2})
}
func solution(_ nums: [Int]) -> Int {
    return nums.reduce(0) { (s1: Int, s2: Int) -> Int in
        return s1+s2
    }
}
func solution(_ nums: [Int]) -> Int {
    return nums.reduce(0) { $0 + $1 }
}
func solution(_ nums: [Int]) -> Int {
    return nums.reduce(0, +)
}

개인적으로 reduce란 함수명이 함수 동작과 그렇게 관련있어 보이진 않음 (잘 안외워진다는 뜻 ㅎㅎ)

 

Map

클로저로 각 항목들을 반영한 결과물을 가진 새로운 배열을 반환합니다.

 

// Declaration
func map<U>(transform: (T) -> U) -> Array<U>

[x1,x2, ...., xn].map(f) -> [f(x1), f(x2), .... f(xn)]
let array = [0, 1, 2, 3]
let addedArray = array.map( { (num: Int) -> Int in return num + 1 } )
// [1, 2, 3, 4]
let addedArray = array.map { (num) in num + 1 }
let addedArray = array.map { $0 + 1 }

'iOS > Swift' 카테고리의 다른 글

Swift로 함수형 프로그래밍 시작하기  (2) 2021.03.28
[Swift] lazy 키워드  (0) 2020.12.20
[Swift] weak, unowned, Retain cycle 톺아보기  (1) 2020.12.10