관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 고차함수map(map, flatMap, compactMap), filter, reduce 본문

iOS 기본 (swift)

[iOS - swift] 고차함수map(map, flatMap, compactMap), filter, reduce

jake-kim 2021. 2. 28. 01:08

고차함수

  • 고차함수: parameter로 함수를 받는 함수
    - higher order function: 함수 내부에서 일어나는 특성 (함수를 인수로 받는 것, 함수를 리턴하는 것)
    - first class: 함수 외부에서 일어나는 특성 (함수를 변수에 대입 가능한 것)
let numbers = [1, 2, 3, 4]
let newNumbers = numbers.map { number in
    return number + 1
}

parameter가 함수 - 고차함수

  • 대표적으로 3가지 존재: map(맵핑), filter(추출), reduce(결합, 차원을 줄여주는 것)
    - reduce는 초기값을 넣어주고, 클로저의 인수는 누적해서 쌓이는 값 하나와 배열의 값
let numbers = [1, 2, 3, 4]

let mapEx = numbers.map { number in
    return number + 1
}
let filterEx = numbers.map { number in
    return number % 2 == 0
}
let reduceEx = numbers.reduce(10, { (number1, number2) in // 초기값을 10으로 지정 (첫 number1의 값은 10)
    print(number1) // 10 -> 11 -> 13 -> 16
    print(number2) // 1 -> 2 -> 3 -> 4
    return number1 + number2
})

print(mapEx) // [2, 3, 4, 5]
print(filterEx) // [false, true, false, true]
print(reduceEx) // 20

map, flatMap, compactMap

  • map: n차 배열 -> n차 배열
  • flatMap: n차 배열 -> n-1차 배열
// ex1)
let numbers = [[1], [2, 3], [4, 5], [6]]
let flatmapEx = numbers.flatMap { number in
    return number
}
print(flatmapEx) // [1, 2, 3, 4, 5, 6]

// ex2)
let numbers = [[1, 2, 3], [4, 5], [6, [7]]]
let flatmapResult = numbers.flatMap { $0 } // [1, 2, 3, 4, 5, 6, [7]]
  • compactMap: n차 배열 -> 'optional binding'이 된 n차 배열
let numbers = [1, 2, 3, nil, Optional(4)]

let flatmapEx = numbers.compactMap { number in
    return number
}
print(flatmapEx) // [1, 2, 3, 4, 5, 6]

filter

  • 클로저에 Bool 값을 리턴하여, true인 값들만 filtering하는 연산자
class Person {
    let id: Int
    let name: String

    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
}

let person1 = Person(id: 1, name: "kim")
let person2 = Person(id: 2, name: "lee")
let person3 = Person(id: 3, name: "lee")

let people = [person1, person2, person3]
let peopleNameLee = people.filter { (person) -> Bool in
    return person.name == "lee"
}
print(peopleNameLee) // Person(id: 2, name: "lee"), Person(id: 3, name: "lee")

reduce

  • 배열을 하나의 값으로 reduce(줄이는) 것: .reduce(초기값) { (누적값 + 배열에 존재하는 값) }
let numbers = [1, 2, 3]
let number = numbers.reduce(5) { (accumulatedValue, value) -> Int in
    return accumulatedValue + value
}
print(number) // 11
Comments