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
}

- 대표적으로 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