Swift - 클로저란?
Swift - 클로저란?
클로저란?
Swift의 일회용 함수를 의미하며 유형은 아래와 같이 3가지로 나뉨.
- 전역 함수: 함수명을 가지고 있으며 주변 환경에서 캡처할 값이 없는 클로저
- 중첩 함수: 함수명을 가지고 있으며 외부 함수에 값을 캡처할 수 있는 클로저
- 클로저 표현식: 이름이 없고 주변 환경으로부터 값을 캡처할 수 있는 경량 문법으로 작성된 클로저
클로저 표현식이란?
- 함수를 경량 문법으로 표현할 수 있도록 한 것.
- 흔히 익명 함수라고도 함.
형식
1
2
3
4
{
(매개변수, ...) -> 반환 타입 in
실행 구문
}
예시
1
2
3
4
{
(num1: Int, num2: Int) -> Int in
return num1 + num2
}
클로저를 직접 실행해서 테스트하는 방법은 크게 2가지가 존재함.
- 변수에 할당하여 실행(일급 함수의 특성)
- 소괄호로 묶어 실행
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1. 변수에 할당하여 사용(일급 함수의 특성)
let fn1 = {
(num1: Int, num2: Int) -> Int in
return num1 + num2
}
print(fn1(10, 20))
// 2. 소괄호로 묶어 실행
let result = ({
(num1: Int, num2: Int) -> Int in
return num1 + num2
})(10, 20)
print(result)
클로저의 경량 문법
- 클로저는 다양한 경량 문법을 제공함.
1.반환 타입 생략 가능
반환 타입을 생략할 경우 클로저가 반환하는 값을 사용하여 컴파일러가 타입을 추론해 처리함.
예시
1
2
var arr = [1, 9, 10, 3, 4]
arr.sort(by: {(num1: Int, num2: Int) -> Bool in return num1 > num2})
위 코드를 아래와 같이 축소시킬 수 있음.
1
2
var arr = [1, 9, 10, 3, 4]
arr.sort(by: {(num1: Int, num2: Int) in return num1 > num2})
2.매개 변수 타입 정의 생략 가능
매개 변수의 타입 정의를 생략할 경우 매개 변수로 넘어가는 값을 통해 컴파일러가 타입을 추론함.
예시
1
2
var arr = [1, 9, 10, 3, 4]
arr.sort(by: {(num1: Int, num2: Int) in return num1 > num2})
위 코드를 아래와 같이 축소시킬 수 있음.
1
2
var arr = [1, 9, 10, 3, 4]
arr.sort(by: {num1, num2 in return num1 > num2})
3.매개 변수 자체를 생략 가능
매개 변수 자체를 생략하고, Swift에서 제공하는 내부 상수를 통해 매개 변수를 처리할 수 있음.
예시
1
2
var arr = [1, 9, 10, 3, 4]
arr.sort(by: {num1, num2 in return num1 > num2})
위 코드를 아래와 같이 축소시킬 수 있음.
1
2
var arr = [1, 9, 10, 3, 4]
arr.sort(by: {return $0 > $1})
매개 변수를 생략할 경우 실행 구문만 남기 때문에
in키워드 생략 가능
4.return 생략 가능
단, return을 생략할 경우 컴파일러에서 해당 클로저 표현식이 어떤 타입을 리턴하는지 알아야 사용이 가능함.
예시
1
2
var arr = [1, 9, 10, 3, 4]
arr.sort(by: {return $0 > $1})
위 코드를 아래와 같이 축소 가능.
1
2
var arr = [1, 9, 10, 3, 4]
arr.sort(by: { $0 > $1 })
위 예시의 경우 sort(by:) 메서드 시그니처를 통해 클로저에서 Bool 타입을 반환할 것을 알고 있기 때문에 문제가 생기지 않음.
This post is licensed under CC BY 4.0 by the author.