Swift언어6 - 함수형 프로그래밍_클로저
1. Swift의 클로저 ( 클로저는 참조 타입이다 )
다른 언어의 블록 ( {...} ) 혹은 Lambda와 유사하다!
클로저는 "일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것"
( 함수는 클로저의 한 형태 )
##클로저는 상수/변수가 선언된 위치에서 Reference를 획득하고 저장할 수 있다.
# Swift의 클로저 형식!
- 기본적 클로저 형식은 아래와 같다
- { (매개변수들) -> 반환 타입 in
실행코드
}
# Swift의 클로저 3가지 형태!
- 이름이 있으면서 어떤 값도 획득하지 않는 전역함수 형태!
- 이름이 있고, 다른 함수 내부 값을 획득할 수 있는 중첩된 함수 형태
- 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약문법으로 작성한 형태
# Swift의 클로저 표현방법 2가지! { }
클로저의 위치를 기준으로 나눌 수 있다.
- 1. 기본 클로저 표현
- 2. 후행 클로저 표현
1. 기본 클로저
-> sorted(by:) 메서드는, 배열의 타입과 같은 두 개의 매개변수를 가지며 Bool 타입을 반환하는 클로저를 전달인자로 받을 수 있다.
함수(클로저의 한 형태!!) 혹은 클로저를 사용하여 오름차순으로 정렬해보았다.
## 1. 미리 구현한 함수를 매개변수로 전달하였고,
## 2. 클로저를 매개변수로 전달하였다.
=> in 키워드는 매개변수&반환 타입과 실행 코드를 구분하기 위해 사용된다!
## 클로저도 _ a: String과 같이 입출력 매개변수 사용 가능
## 가변 매개변수 사용 가능 ( 매개변수 이름 지정해야함)
## But 매개변수 기본값을 사용할 수 없음
==> 미리 구현된 함수를 사용할 때보다 코드가 간결해지고, 함수가 어디있는지 찾아다니지 않아도 됨!
2. 후행 클로저
후행클로저란???
함수 매개변수로, () 안쪽에 전달하는 것이 아니라, 함수 메서드를 닫고, 그 뒤에 arr.sorted(){ ~~` }와 같이 클로저를 전달해주는 것 이 후행 클로저이다.
-> 여러개 클로저를 전달할 때는, 마지막 클로저 하나만 후행 클로저로 전달 가능
-> 단 하나의 클로저만 전달인자로 전달하는 경우에는 함수의 소괄호() 생략 가능! ( 아래 이미지처럼 )
- 클로저가 길어지거나, 가독성이 떨어진다 싶으면 후행클로저를 사용!
## 클로저는 메서드에서 요구하는 형태로 전달해야하므로, 매개변수의 타입, 개수, 반환타입 등 유추 가능!!
따라서 매개변수/반환값 타입 굳이 표현하지 않고 생략해도 된다!!
# 더 간결한 Swift의 클로저 표현
1. 단축 인자 이름
- (a, b) -> Bool in 에서 a, b와 같은 매개변수 이름은 의미없기에,
위처럼 $0, $1, $2, ... 순서로 단축 인자 표현을 사용할 수 있고, 이렇게 되면 in 키워드도 사용할 필요가 없게 된다!!
2. 암시적 반환 표현 (return 생략)
- 클로저의 실행문이 단 한 줄이라면, 암시적으로 해당 실행문을 반환값으로 사용할 수 있다!
# Swift의 클로저 값 획득 !
## 클로저는 자신이 정의된 위치 주변 상수나 변수를 "획득(Capture)"할 수 있다!
-> 더 이상 존재하지 않게된 상수나 변수를 "획득" 해놓았다면, 지속적으로 내부에서 참조하거나 수정하며 사용할 수 있다
==> 이것이 비동기 Call-back에 많이 사용됨!! ( 현재 상태를 미리 획득해두고, 실제로 클로저 기능을 실행할 때 해당 변수/상수가 메모리에 존재하지 않아도 괜찮음 )
# 예시
=> makeIncrementer()함수가 끝나도, amount와 total 매개/지역변수들은 사라지지 않고, incrementer가 호출될 때마다 계속 사용할 수 있다.
=> 각각이 자신만의 total변수를 갖고 카운트하게 된다.
=> 다른 함수의 영향도 전혀 받지 않는다! ( 각자 자신만의 total의 참조를 미리 획득했기 때문 )
# Swift의 탈출 클로저 !
## 클로저