클로저 (Closure)
- 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호"{}" 구분된 코드의 블록
- 이름이 없는 함수
- 클로저는 어떠한 상수나 변수의 참조를 캡처(capture)해서 저장 가능
- Swift는 이 캡처와 관련한 모든 메모리를 알아서 처리
- 파라미터를 받을 수 있고, 반환 값이 존재할 수 있다는 점에서 함수와 동일
- Swift 클로저는 최적화를 통해 깔끔하고 명확한 스타일을 가지고 있음
- 문맥(context)에서 인자 타입과 반환 타입의 추론
- 단일 표현식 클로저의 암시적 반환
- 축약된 인자 이름
- 후위 클로저 문법
{ (매개변수 이름 : 매개변수 타입) -> 반환타입 in
클로저 표현식 코드
}
후행 클로저 (trailing closure)
- 클로저가 함수의 마지막 argument라면, 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있게 해주는 것
//후행 클로저 미사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default, handler: {
//실행 코드
})
//후행 클로저 사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default) {
//실행 코드
})
클로저 축약 표현
- 타입 생략
- 클로저는 메서드에서 요구하는 형태로 전달해야 함
- 그래서 스위프트에서는 이러한 문맥을 이용해 타입을 유추할 수 있음
- 그래서 매개변수의 타입이나 반환 타입을 생략해서 클로저를 사용 가능
- return 생략
- 매개변수 생략
- 매개변수의 이름을 명시하지 않아도 $와 숫자의 조합으로 단축 인자 이름을 사용 가능
- $0이 첫 번째 매개변수가 되고 $1는 두 번째 매개변수
- 'in' 키워드도 생략
- 연산자만 표기
- 클로저는 매개변수의 타입과 반환 타입이 연산자를 구현한 함수의 모양과 동일하다면, 연산자만 표기하더라도 알아서 연산하고 반환
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversed = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
//타입 생략
let reversed = names.sorted(by: { (s1, s2) in
return s1 > s2
})
//return 생략
let reversed = names.sorted(by: { (s1, s2) in
s1 > s2
})
//매개변수 생략
let reversed = names.sorted(by: {
return $0 > $1
})
//연산자만 표기
let reversed = names.sorted(by: >)
반응형
'⌨️ Language > swift' 카테고리의 다른 글
[Swift] 에러 처리 (0) | 2023.02.07 |
---|---|
[Swift] 고차함수 (0) | 2023.02.06 |
[Swift] 익스텐션 (Extensions) (0) | 2023.02.06 |
[Swift] 프로토콜 (Protocol) (0) | 2023.02.06 |
[Swift] assert와 guard (0) | 2023.02.06 |
댓글