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