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 : 현재 순회하고 있는 요소의 값