RxSwift를 공부하면서 Closure가 다시 등장했다. 들어본 개념이고, 제대로 파보진 않았어서 겸사겸사 정리.
Closure는 Swift의 함수형 프로그래밍 패러다임을 접할 때 꼭 알아야 할 개념 중 하나이다.
Closure는 일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것을 의미한다. Swift의 Closure는 C언어나 Objective-C의 blocks 이나 다른 프로그래밍 언어의 lambdas와 비슷하다. (함수와 비슷하다고 볼 수 있는데, 사실 함수는 Closure의 한 형태라고 볼 수 있다.)
Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to blocks in C and Objective-C and to lambdas in other programming languages.
Closure는 상수나 변수가 선언된 위치에서 references를 capture, store 할 수 있다. 이를 상수나 변수의 closing(클로징, 잠금) 이라고 한다. 이는 Closure라고 이름 붙여진 이유이기도 하다. 메모리 부담이 걱정된다고? 우리가 알고 있듯 Swift는 스스로 메모리를 관리한다.
Closures can capture and store references to any constants and variables from the context in which they’re defined. This is known as closing over those constants and variables. Swift handles all of the memory management of capturing for you.
Closure는 다음 3가지 중 하나의 형태를 띈다.
Closures take one of three forms:
- Global functions are closures that have a name and don’t capture any values.
- Nested functions are closures that have a name and can capture values from their enclosing function.
- Closure expressions are unnamed closures written in a lightweight syntax that can capture values from their surrounding context.
Contents
- Closures (기본 클로저) ✅
- Trailing Closures (후행 클로저)
- Closure Expression (클로저 표현 & 간소화)
- Capturing Values (값 획득)
- Closures Are Reference Types (클로저는 참조 타입)
- Escaping Closures (탈출 클로저)
- Autoclosures (자동 클로저)
Closures / 기본 클로저
Closure의 기본적인 표현 방식은 다음과 같다.
Closure expression syntax has the following general form:
{ (parameters) -> return type in
statements
}
Array의 .sorted(by: ) 메소드를 통해 Closure를 살펴보자.
다음과 같이 이름이 들어 있는 배열을 알파벳 역순으로 정렬해야 한다고 하자. ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
.sorted(by:) 메소드의 parameter에 backward 함수를 만들어서 그대로 집어넣었다.
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
backward 함수 대신 Closure 표현으로 대체해보자. 코드는 다음과 같이 간결해진다.
이를 Inline Closure라고 하고, Closure의 body는 in 키워드 뒤에 나온다.
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
Trailing Closures / 후행 클로저
매개변수로 클로저를 사용할 때 XCode의 자동완성 기능을 사용하면 매번 봤던 코드. 그게 바로 후행클로저의 표현방식이었다. ㅋ
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}
// Here's how you call this function without using a trailing closure:
someFunctionThatTakesAClosure(closure: {
// closure's body goes here
})
// Here's how you call this function with a trailing closure instead:
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}
(to be continued...)
Reference
'Development > Swift' 카테고리의 다른 글
[Swift] 필수 개념 (feat. Coding Test) (0) | 2022.03.16 |
---|---|
[Swift] Higher Order Function / 고차함수 (0) | 2022.02.25 |
[Swift] Extensions (0) | 2021.12.17 |
[Swift] Structures and Classes (0) | 2021.12.14 |
[Swift] Optional (0) | 2021.12.07 |