클로저는 아래 규칙을 통해 다양한 모습으로 표현될 수 있음
1. 후행 클로저 : 함수의 매개변수 마지막으로 전달되는 클로저는 후행 클로저(trailing closure)로 함수 밖에 구현할 수 있음
2. 반환타입 생략 : 컴파일러가 클로저의 타입을 유추할 수 있는 경우 매개변수, 반환 타입을 생략할 수 있음
3. 단축 인자 이름 : 전달인자의 이름이 굳이 필요없고, 컴파일러가 타입을 유추할 수 있는 경우 축약된 전달인자 이름($0, $1, $2 ..)을 사용할 수 있음
4. 암시적 반환 표현 : 반환 값이 있는 경우, 암시적으로 클로저의 맨 마지막 줄은 return 키워드를 생략하더라도 반환 값으로 취급
기본 클로저 표현
1 2 3 4 5 6 | // 클로저를 매개변수로 갖는 함수 calculated(a:b:method:)와 결과값을 저장할 변수 result 선언 func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int { return method(a, b) } var result: Int | cs |
1. 후행 클로저
클로저가 함수의 마지막 전달인자일 때, 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있음
1 2 3 4 5 | result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in return left + right } print(result) // 20 | cs |
2. 반환타입 생략
calculate(a:b:method:) 함수의 method 매개변수는 Int 타입을 반환할 것이라는 사실을 컴파일러도 알기 때문에
굳이 클로저에서 반환타입을 명시해주지 않아도 됨. 대신 in 키워드는 생략할 수 없음
1 2 3 4 5 6 7 8 9 10 11 12 | result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in return left + right }) print(result) // 20 // 후행클로저와 함께 사용할 수도 있음 result = calculate(a: 10, b: 10) { (left: Int, right: Int) in return left + right } print(result) // 20 | cs |
3. 단축 인자이름
클로저의 매개변수 이름이 굳이 불필요하다면 단축 인자이름을 활용할 수 있음. 단축 인자이름은 클로저의 매개변수의 순서대로
$0, $1, $2 ... 처럼 표현함.
1 2 3 4 5 6 7 8 9 10 11 12 13 | result = calculate(a: 10, b: 10, method: { return $0 + $1 }) print(result) // 20 // 당연히 후행 클로저와 함께 사용할 수 있음 result = calculate(a: 10, b: 10) { return $0 + $1 } print(result) // 20 | cs |
4. 암시적 반환 표현
클로저가 반환하는 값이 있다면 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급함
1 2 3 4 5 6 7 8 9 10 | result = calculate(a: 10, b: 10) { $0 + $1 } print(result) // 20 // 간결하게 한 줄로 표현해 줄 수도 있음 result = calculate(a: 10, b; 10) { $0 + $1 } print(result) // 20 | cs |
❖축약 전과 후 비교❖
1 2 3 4 5 6 7 8 9 | // 축약 전 result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) -> Int in return left + right }) // 축약 후 result = calculate(a: 10, b: 10) { $0 + $1 } print(result) // 20 | cs |
제 나름대로 생각을 정리하며 포스팅합니다.
정보전달에 있어 차질이 생기는 것을 우려해 나름대로 확실하게 검증을 하고 포스팅하려고 노력합니다.
본 포스팅에 잘못된 정보가 있거나 수정해야할 내용이 있다면 댓글 또는 아래의 이메일로 알려주시면 감사하겠습니다.
E-mail : silent_lhr@naver.com
공감은 로그인이 필요없습니다.
공감은 저에게 포스팅을 이어나갈 수 있는 힘이 됩니다.
'프로그래밍 [KOR] > Swift' 카테고리의 다른 글
Swift의 프로퍼티 감시자 (0) | 2018.10.11 |
---|---|
Swift의 프로퍼티 (0) | 2018.10.11 |
Swift의 클로저 (0) | 2018.10.10 |
Swift의 값/참조 타입 (0) | 2018.10.10 |
Swift의 열거형 (0) | 2018.10.08 |