고차함수 (High order function)
다른 함수를 매개변수로 받거나 반환하는 함수를 의미한다.
클로저와는 다르다 (클로저는 이름이 없는 익명함수)
고차함수가 매개변수로 받는 함수가 클로저일때가 많아서 헷갈릴수는 있지만, 고차함수 안에서 클로저를 자주 사용하는 것 뿐 같은 개념은 아니다.
특징
- 가독성
- 함수형 프로그래밍 스타일
- 재사용성 높음
map
let numbers = [1, 2, 3, 4, 5]
let twoTimesNumbers = numbers.map{ $0*2 }
//[2, 4, 6, 8, 10]
각 요소에 동일한 연산을 적용해 새로운 배열을 반환한다.for-in
문과 비교했을 때 차이는 없지만, 속도면에서 차이가 있다. (요소가 많을수록 차이 남)
flatMap
let numbers = [[1, nil], [nil, nil, 2], [3]]
let flatArray = numbers.flatMap{ $0 }
//[Optional(1), nil, nil, nil, Optional(2), Optional(3)]
다차원 배열을 1차원 배열로 flat하게 만들어 반환한다.
Optional을 따로 처리하진 않기 때문에 만약 Optional을 없애고 싶다면 CompactMap을 같이 쓰면 된다!
사용하다보면 1차원 배열에 flatMap을 써도 옵셔널이 제거되는걸 볼 수 있는데, deprecated 된 것이니까 compactMap을 쓰자.
자세한건 compactMap에 설명
compactMap
let numbers = [1, nil, 3, nil, 5]
let numbersWithOutNil = numbers.map{ $0 }
//[1, 3, 5]
요소 중 Optional을 제거한 나머지 요소들을 반환한다.
Nil이 있는 1차원 배열에 FlatMap을 사용해도 compactMap과 동일한 기능을 하는데,
이는 Swift4.1 이전 flatMap이 두 기능(평탄화, 옵셔널제거)을 모두 같이 했었다가
이후에 평탄화만 되는 flatMap, 옵셔널 제거를 위한 compactMap 두 가지로 나눴다.
filter
let numbers = [1, 2, 3, 4, 5]
let temp = numbers.filter{ $0 % 2 == 0 }
//[2, 4]
요소 중 주어진 조건을 만족하는 요소들만 포함하는 새로운 배열을 반환한다.
reduce
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0, +)
//15
모든 요소를 하나로 합쳐 단일값을 반환한다.
초기값과 결합하는 방법을 파라미터로 넘기면 된다.
결합하는 방법은 간단하게 사칙연산자를 사용해도 되고, numbers.reduce(0) {$0 + $1}
처럼 클로저를 사용하는것도 가능하다.
ForEach
let numbers = [1, 2, 3, 4, 5]
numbers.forEach { number in
print(number)
}
각 요소에 대해 주어진 작업을 수행한다. 반환값은 없고, 반복문 대용으로 사용하는 편.
for-in
문과 비슷해보이지만 break
, continue
와 같은 반복문에 들어가는 키워드를 사용할 수 없다.