지난 클로저에 이은 클로저에 다양한 사용법에 대해 알아보겠습니다.
[클로저의 기본 개념]
2022.02.01 - [iOS/Swift 문법 심화 학습] - 클로저
예제
- 먼저 클로저를 사용하기 위한 함수를 만들겠습니다.
- 메소드라는 이름으로 클로저를 전달 받아 기능을 구현하는 함수입니다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
후행 클로저
후행 클로저 정의
= 후행 클로저는 클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략하고
함수 소괄호 외부에 클로저를 구현할 수 있습니다.
- 일반 클로저와 다르게 calculate 함수 뒤에 method가 없이, 괄호 뒤에 바로 클로저가 사용되었습니다.
- 이렇게 method가 생략된 것을 보아, 이 클로저는 함수의 마지막 전달인자란걸 알 수 있습니다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var result: Int
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
return left + right
}
print(result)
실행결과
// 20
반환타입 생략
반환타입 생략
= calculate함수의 method 매개변수는 Int 타입을 반환할 것이라는 것을 컴파일러도 알고 있습니다.
때문에 클로저에 반환타입을 명시하지 않아도 기능을 구현할 수 있습니다. ( 단, in 키워드는 생략 불가 )
- calculate 함수에 매개변수의 자료형 타입이 명시되어있기 때문에 클로저 내에서 반환타입을 생략했습니다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var result: Int
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in
return left + right
})
print(result)
실행결과
// 20
- 다음과 같이 후행 클로저와도 함께 사용할 수 있습니다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var result: Int
result = calculate(a: 10, b: 10) { (left: Int, right: Int) in
return left + right
}
print(result)
실행결과
// 20
단축 인자이름
단축 인자이름
= 클로저의 매개변수 이름이 굳이 필요하지 않다면, 단축 인자이름을 사용할 수 있습니다.
단축 인자이름은 클로저의 매개변수 순서대로 $0, $1, $2, $3.. 과 같이 표현합니다.
- 위의 예제에서 사용되었던 left, right라는 매개변수의 이름이 없어도 기능 구현이 가능합니다.
- 반환타입 또한 생략 가능합니다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var result: Int
result = calculate(a: 10, b: 10, method: {
return $0 + $1
})
print(result)
실행결과
// 20
- 다음과 같이 후행 클로저와 함께 사용할 수 있습니다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var result: Int
result = calculate(a: 10, b: 10) {
return $0 + $1
}
print(result)
실행결과
// 20
암시적 반환 표현
암시적 반환 표현
= 클로저가 반환하는 값이 있다면 return 키워드를 사용하지 않아도,
클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급합니다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var result: Int
result = calculate(a: 10, b: 10) {
$0 + $1
}
print(result)
실행결과
// 20
- 코드가 길지 않다면 다음과 같이 한 줄로 표현할 수도 있습니다.
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
var result: Int
result = calculate(a: 10, b: 10) { $0 + $1 }
print(result)
실행결과
// 20
※ 클로저를 축약하여 사용할 때 주의사항
= 클로저를 너무 축약한다면 다른사람이 코드를 이해할 수 없기 때문에 적당하게 축약사용을 해야합니다.
내용출처
https://www.youtube.com/watch?v=WvqYKP6VgNQ&list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy&index=18
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
클래스 [ Class ] (0) | 2022.02.03 |
---|---|
구조체 [ Struct ] (0) | 2022.02.03 |
클로저 (0) | 2022.02.01 |
값 타입과 참조 타입 (0) | 2022.01.31 |
extensions (0) | 2022.01.30 |
댓글