Post

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.