클로저 고급 - 다양한 클로저 표현
1. 후행 클로저 : 함수의 매개변수 마지막으로 전달되는 클로저는 후행 클로저(trailing closure)로 함수 밖에 구현할 수 있음
2. 반환 타입 생략 : 컴파일러가 클로저의 타입을 유추할 수 있는 경우 매개변수, 반환 타입 생략 가능
3. 단축 인자 이름 : 전달 인자의 이름이 굳이 필요 없고, 컴파일러가 타입을 유추할 수 있는 경우 축약된 전달 인자 이름 사용. how? $0, $1, $2 ...
4.암시적 반환 표현 : 반환 값이 있는 경우, 암시적으로 클로저의 맨 마지막 줄은 return 키워드를 생략하더라도 반환 값으로 취급
기본 클로저 표현
//클로저를 매개변수로 갖는 함수 calculated)
func calculate(a:Int, b:Int, method:(Int,Int) -> Int{
return method(a,b)
}
//결과값을 저장할 변수 result 선언
var result: Int
후행 클로저
클로저가 함수의 마지막 전달 인자일 때 마지막 매개변수 이름을 생략한 후 함수 소괄호 밖에 클로저 구현 가능
result = calculate(a:10, b:10) {(left:Int, right:Int) -> Int in
return left+right
}
print(result) //20
클로저가 시작되는 { 기호를 보면 calculate가 닫히고 외부에서 구현된 것을 확일할 수 있다
반환타입 생략
calculate(a:b:method:) 함수의 method 매개변수는 Int 타입을 반환할 것이라는 사실을 컴파일러도 안다.
굳이 클로저에서 반환 타입을 명시해주지 않아도 됨. 하지만 In 키워드는 생략 불가능
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
원래는 클로저 구문에서 right:Int) -> Int in 이었는데 Int를 생략함
단축 인자 이름
클로저의 매개변수 이름이 굳이 불필요하다면 단축 인자 이름 활용 가능. 단축 인자 이름은 클로저의 매개변수 순서대로
$0, $1, $2 ... 로 표현
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
원래는 클로저 구문에서 {left:Int, right:Int 가 있었는데 생략했음
암시적 반환 표현
클로저가 반환하는 값이 있다면 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급한다.
result=calculate(a:10, b:10) {
$0 + $1
}
print(result) //20
//한줄로 표현 가능
result=calculate(a:10, b:10) { $0+$1 }
print(result) //20
return 없이 바로 $0 + $1로 표현
기본형과 축약형을 비교해보자
//기본형
result=calculate(a:10, b:10, method: { (left:Int, right:Int) -> Int in
return left+right
})
//축약형
result=calculate(a:10, b:10) { $0+$1 }
코드란 게 사람끼리 서로 보면서 이해하고 비교하는 건데 너무 축약해버리면 이해하기 어렵다고 하니 적당히 축약하자~
'iOS > Swift' 카테고리의 다른 글
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 20. 프로퍼티 감시자 (0) | 2021.07.24 |
---|---|
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 19. 프로퍼티 (0) | 2021.07.24 |
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 17. 클로저 기본 (0) | 2021.07.22 |
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 16. 클래스 vs 구조체 / 열거형 (0) | 2021.07.21 |
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 15. 열거형 (0) | 2021.07.21 |