Swift의 클로저와 고차함수에 대해서 Araboza
1. 클로저(Closure) 기초
클로저는 코드의 블록
이며 일급시민(first-citizen)
이다.
함수의 전달인자, 변수, 상수 등으로 저장, 전달이 가능하다.
함수 내부에서 원하는 코드블럭
실행이 가능하다.
// 클로저의 사용
// sum이라는 상수에 클로저를 할당
let sum: (Int, Int) -> Int = { (a: Int, b: Int) in
return a + b
}
let sumResult: Int = sum(1, 2)
print(sumResult) // 3
2. 다양한 클로저 표현
함수의 마지막 매개변수에 전달되는 클로저는 후행클로저(trailing closure)로 함수 소괄호 밖에 구현이 가능하다.
컴파일러가 클로저의 타입을 유추할 수 있는 경우 매개변수, 반환 타입 생략이 가능
하다.
반환 값이 있는 경우, 암시적으로 클로저의 맨 마지막 줄은 return
키워드를 생략해도 반환 값으로 취급한다.
전달인자의 이름이 굳이 필요없고, 컴파일러가 타입을 유추할 수 있는 경우 축약된 전달인자 이름($0, $1, $2…)
사용 가능하다.
3. 고차함수(Higher-order function)
고차함수는 다른 함수를 매개변수의 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수이다.
유용한 고차함수는 스위프트 표준 라이브러리에서 제공한다. (map
, filter
, reduce
등)
컨테이너 내부의 기존 데이터를 변형(transform)하여 새로운 컨테이너를 생성한다.
flatMap
compactMap
nil
이 아닌 배열 반환한다.result
: 초깃값으로부터 출발하여 마지막 요소까지 순회하는 내내의 결괏값currentItem
: 현재 순회하고 있는 요소의 값