RxSwift의 Operator를 배우던 중에 다시 만난 map, filter.
이의 기본이 되는 Swift의 대표적인 고차함수인 map, filter, reduce를 알아보자.
고차함수란? Higher Order Functions
다음 중 하나를 수행하는 함수이다.
- 하나 이상의 함수를 인수로 취한다.
- 함수를 결과로 반환한다.
Swift의 Function(함수)는 First-Class Citizen(일급객체)이므로 값처럼 인자로 전달할 수도 있고 반환할 수도 있다.
고차함수는 왜 쓰냐고? 데이터의 연산을 쉽게 처리하기 위해서.
Swift의 대표적인 고차함수인 map(변형), filter(거름), reduce()를 알아보자.
Swift의 Collection Types(Array, Dictionary, Set)에서는 이 함수들을 모두 사용할 수 있다.
map
컨테이너 내부의 기존 값을 변형시켜 새로운 컨테이너에 담아 반환한다.
함수는 클로저(일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것)의 한 형태이다. 따라서 다음과 같이 클로저로 간결하게 표현하는 것도 가능하다.
import Foundation
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 'letterCounts' == [6, 6, 3, 4]
cf. flatMap, compactMap
더보기
결과값을 join 해서 반환해주는 flatMap
let numbers = [1, 2, 3, 4]
let mapped = numbers.map { Array(repeating: $0, count: $0) }
// [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
let flatMapped = numbers.flatMap { Array(repeating: $0, count: $0) }
// [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
non-nil 결과 값만 반환해주는 compactMap
let possibleNumbers = ["1", "2", "three", "///4///", "5"]
let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
// [1, 2, nil, nil, 5]
let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
// [1, 2, 5]
filter
컨테이너 내부의 값을 걸러서 새로운 컨테이너에 담아 반환한다.
let numbers = [1, 2, 3, 4]
let filteredNumbers = numbers.filter { $0 > 2 }
// 'filteredNumbers' == [3, 4]
reduce
컨테이너 내부의 값을 결합해서 하나의 값으로 반환한다.
let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, { x, y in
x + y
})
// numberSum == 10
Reference
'Development > Swift' 카테고리의 다른 글
[Swift] 필수 개념 (feat. Coding Test) (0) | 2022.03.16 |
---|---|
[Swift] Closure (0) | 2022.02.17 |
[Swift] Extensions (0) | 2021.12.17 |
[Swift] Structures and Classes (0) | 2021.12.14 |
[Swift] Optional (0) | 2021.12.07 |