STUDY/Swift

Swift 클로저 [Closure]

The Simpler 2018. 6. 22. 16:47

Swift4 Closure

0. 함수는 클로저의 일종이다.

1. 함수의 전달인자로서의 클로저 사용: 함수를 선언하고 사용할 때 주고받는 전달인자의 자리에 클로저를 쓸 수 있다.

2. 기본 클로저: 매개인자들이 사용 되어지는 자리에 쓰인다.

3. 후행 클로저: 클로저가 함수의 마지막 전달인자라면 소괄호 ')' 이후에, 외부에 클로저를 구현할 수 있다. (함수의 선언이 아니라 사용할 때 이야기)

4. 반환타입 생략 가능: 우리는 앞서 선언했기 때문에(아래 3번째 줄), 사용할 때 반환 타입을 생략할 수 있다. (컴파일러가 이미 반환타입을 알고 있기 때문)

5. 단축 인자 이름 사용 가능: 매개변수의 이름이 굳이 불필요 하다면, 순서대로 $0, $1, ... 이렇게 사용할 수 있다.

6. 암시적 반환 표현: 클로저 마지막 줄의 결과값을 암시적으로 반환값으로 취급한다. (return을 쓰지 않아도 된다는 뜻)

* 지나치게 줄이는 것이 좋은 것은 아니다. 컴파일러는 알아들을 수 있지만, 사람이 알아보기 힘들 수 있기 때문이다. 사람이 알아볼 수 있는 선까지만 축약을 하도록 한다.


* 이 포스팅은 야곰님의 '클로저 기본', '클로저 고급'을 보고 작성한 것입니다.

https://www.youtube.com/watch?v=WvqYKP6VgNQ


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import UIKit
//MARK: - 함수의 전달인자로서의 클로저
func calculate(a: Int, b: Int, method: (IntInt-> Int-> Int {
    return method(a, b)
}
var result: Int
//MARK: - 기본 클로저
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int-> Int in
    return left / right
    })
print(result) // 1
    
//MARK: - 후행 클로저
// 클로저가 함수의 마지막 전달 인자라면 마지막 매개변수 이름을 생략한 후
// 함수 소괄호 ')' 외부에 클로저를 구현할 수 있습니다.
result = calculate(a: 10, b: 10) { (left: Int, right: Int-> Int in
    return left + right
}
print(result) // 10 + 10 = 20
//MARK: - 반환타입 생략
// calculate 함수의 method 변수는
// Int 타입을 반환할 것이라는 사실을 컴파일러도 알기 때문에
// 굳이 클로저에서 반환타입을 명시해주지 않아도 됩니다.
// 대신 in 키워드는 생략할 수 없습니다.
result = calculate(a: 10, b: 10, method: { (left: Int, right: Intin
    return left + right
})
// 후행 클로저와 함께 사용할 수도 있습니다.
result = calculate(a: 10, b: 10) { (left: Int, right: Intin
    return left - right
}
print(result) // 0
//MARK: - 단축 인자 이름
// 클로저 매개변수의 이름이 굳이 불필요하다면 단축 인자 이름을 사용할 수 있습니다.
// 단축 인자 이름은 클로저의 매개변수의 순서대로 $0, $1... 처럼 표현합니다.
result = calculate(a: 10, b: 10, method: {
    return $0 * $1
})
print(result) // 100
// 당연히 후행 클로저와 함께 사용할 수 있습니다.
result = calculate(a: 10, b: 10) {
    return $0 * $1
}
print(result) // 100
//MARK: - 암시적 반환 표현
// 클로저가 반환하는 값이 있다면 ' -> Int '
// 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급합니다.
result = calculate(a: 10, b: 10) {
    $0 + $1
}
print(result) // 20
// 간결하게 한 줄로도 표현해줄 수도 있습니다.
result = calculate(a: 10, b: 10) { $0 - $1 }
print(result) // 0
//MARK: - 축약하지 않은 클로저 문법과 축약 후의 클로저 문법 비교
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int-> Int in
    return left + right
})
result = calculate(a: 10, b: 10) { $0 + $1 }
// 무조건 줄인다고 좋은 것은 아니다.
// 컴파일러가 알아듣는다고 해서 사람이 알아보기 쉬운 것은 아니기 때문.
 
cs