본문 바로가기

프로그래밍 [KOR]/Swift

Swift의 클로저 고급

클로저는 아래 규칙을 통해 다양한 모습으로 표현될 수 있음


  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: (IntInt-> 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: Intin
    return left + right
})
 
print(result) // 20
 
// 후행클로저와 함께 사용할 수도 있음
result = calculate(a: 10, b: 10) { (left: Int, right: Intin
    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