고차함수란 다음 두 가지 중 하나를 만족하는 함수입니다.
이는 함수를 데이터처럼 다룬다는 아이디어를 기반으로 합니다.
함수가 일급 시민으로 간주되기 때문에 가능합니다.
일급 시민으로 간주된다는 것은 함수도 class나 struct처럼 간주될 수 있다는 것으로 외부 상태를 캡쳐하느냐에 따라 힙 또는 스택에 저장됩니다.
특정 로직을 일반화하고 추상화할 수 있으며 클로저와 자주 결합하여 사용합니다.
간단한 사용법은 위와 같으며 좀 더 실사용적인 예시는 다음과 같습니다.
func animateView(_ view: UIView, completion: @escaping () -> Void) {
UIView.animate(withDuration: 1.0, animations: {
view.alpha = 0
}, completion: { _ in
completion()
})
}
animateView(someView) {
print("Animation finished. Performing next steps...")
}
위 코드는 애니메이션이 진행된 후의 동작을 정의해서 사용하고 있습니다.
상황에 따라 저런 프린트가 아닌 데이터를 업데이트하거나 화면전환을 시도하는 등 유연한 사용이 가능해집니다.
또 애니메이션의 경우 비동기로 작동하므로 완료 시점을 알아야 하는 상황에서도 유용합니다.
위 코드처럼 함수를 반환하는 함수는 상황에 맞게 필요한 함수를 동적으로 만들 수 있습니다.
또는 이처럼 클로저 캡처를 활용하여 호출 횟수를 추적하는 등의 동작도 가능합니다.
스위프트에서는 정말 다양한 고차함수를 표준라이브러리로 제공하고 있습니다.
이외에도 sorted(by:)나 forEach 등 다양한 것들이 있습니다.
컬렉션 타입과 결합하여 사용하는 경우가 많습니다.
for이나 if 문 대신 map, filter, reduce 등을 사용하여 코드의 간결성과 의도를 더 정확히 알 수 있는 가독성을 높일 수 있고
재사용성도 높습니다.
오 고차함수~~!~! 저는 filter랑 reduce를 가장 좋아해여 걸러주고 더해주는거 코테에서 체고