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: (Int, Int) -> 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: Int) in return left + right }) // 후행 클로저와 함께 사용할 수도 있습니다. result = calculate(a: 10, b: 10) { (left: Int, right: Int) in 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 |
'STUDY > Swift' 카테고리의 다른 글
Swift nil 병합 연산자, 옵셔널 관련 연산자 (0) | 2018.06.29 |
---|---|
Swift 구조체와 클래스 [Struct, Class] (0) | 2018.06.29 |
Swift 3.0 Thread 1:signal SIGABRT (1) | 2016.12.13 |
iOS 앱 실행과정 (0) | 2016.12.08 |
앱 시작화면 시간 늘이기, 앱 실행 지연 시키기 (0) | 2016.12.08 |