클로저 관련 포스팅 세 번째 시간입니다! 🤪
클로저 표현식(Closure Expression)의 형태가 다소 난해해서
앞으로 어떻게 사용할지, 막막한 생각에 사로잡히길 마련입니다.
따라서, 이번 포스팅에서는
조금 더 간결하고, 편리하게 클로저를 작성하고 활용할 수 있는
클로저 표현식의 경량문법에 대해 다뤄볼까 합니다.
클로저의 경량문법(lightweight syntax)
클로저 구문의 최적화를 위한 단축된 문법형태
보기만 해도 복잡 다난한 클로저를 단순하고 간결하게 작성하고 활용할 수 있습니다!
클로저의 경량문법을 아래와 같이 3단계로 구분해보았습니다.
- 타입유추를 통한 매개변수 및 리턴형식 생략
- 짧은 인자이름 (Shorthand Argument Names)
- 후행 클로저(Trailing Closures)
위 순서에 따른 경량문법 방식을 살펴보기 이전에,
공통적으로 활용되는 예시 코드는 다음과 같습니다.
// name이란 함수는,
// 3개의 인자를 가지고 있으며, String 타입의 값을 반환하는 클로저(Closure)를 매개변수로 받고 있음
// 또한, 콜백함수로 각각의 인자 값을 넘기고 있음
func name(closure: (String, String, String) -> String) {
closure("Ap", "p", "le") // 콜백함수
}
// 따라서, 실제 name 함수를 호출하기 위해 다음과 같이(인라인 클로저)작성해야 했음
// 인라인 클로저(Inline Closure) : 함수(func) 형태가 아닌, 함수의 인자형태로 포함된 클로저
name(closure: { (a: String, b: String, c: String) -> String in
return a + b + c
}) // "Apple"
타입 유추(Inferring Type) - 매개변수 타입과 리턴타입 생략
- 변수/상수를 선언할 시, 데이터 타입(Data Type)을 생략하는 방식과 동일합니다.
- 매개변수의 타입과 리턴타입의 타입이 동일할 경우, 타입 유추를 통해 생략합니다.
- 위 인라인 클로저에서의 매개변수 타입과 리턴타입은?
- .... (a: String, b:String, c: String) -> String ....
- 이를 타입 유추하면, 아래와 같이 경량문법으로 작성할 수 있습니다.
name(closure: { (a, b, c) in
return a + b + c
}) // "Apple"
짧은 인자이름(Shartand Argument Name) - index를 이용한 접근
- '짧은 인자이름'이란, 클로저의 매개변수를 대신하는 Index 인자입니다.
- 매개변수의 자체를 index로 변환, $ 키워드를 활용하여 접근합니다.
- 예시 코드에서 사용된 매개변수인 a, b, c 를 ➟ $0, $1, $2 로 대신합니다.
- 매개변수 자체가 생략되니, in 키워드 또한 함께 생략됩니다.
- 반환값(Return Type)을 변환된 index 키워드로 대체하므로,
- Closure Head, Closure body를 구분하는 in 키워드는 자연스럽게 삭제됩니다.
name(closure: {
return $0 + $1 + $2
}) // "Apple"
// 함수와 동일하게, 단일한 값을 반환할 경우엔 return 키워드 또한 생략 가능
name(closure: {
$0 + $1 + $2
}) // "Apple"
후행 클로저 (Trailing Closure) - 마지막 매개변수일 경우 생략
- 후행, 즉 함수의 마지막 파라미터가 '클로저'일 경우 인자를 생략할 수 있습니다.
- 함수 'name'의 처음이자 마지막인 매개변수 가 바로 '클로저' 형태입니다!
- 즉, 'closure'이름의 인자의 경우, 클로저 호출 시 생략이 가능합니다.
name() {
$0 + $1 + $2
} // "Apple"
// 한번 더 나아가, 파라미터 내 타입이 없으므로 () 괄호 또한 생략 가능
name {
$0 + $1 + $2
} // "Apple"
복잡했던 클로저가, 경량문법을 통해 매우 간단해졌네요!
포스팅한 내용 이외..
@autoclosure 라던지, @escaping 과 같은 보다 심화된 클로저 내용이 있지만,
기본적인 클로저 활용방식을 다룬 이후
class, struct 문법을 다루며 추가적으로 포스팅 하도록 하겠습니다.
'iOS > Swift' 카테고리의 다른 글
[iOS/Swift] 클래스(Class)의 선언과 구성요소 파악하기 (1) | 2023.01.31 |
---|---|
[iOS/Swift] 프레임워크(Framework)와 클래스(Class)와의 관계 (1) | 2023.01.30 |
[iOS/Swift] 클로저 표현식(Closure Expression)과 1급 객체 조건 (0) | 2023.01.26 |
[iOS/Swift] 익명 혹은 람다함수는 모두 클로저(Closure)일까? (0) | 2023.01.25 |
[iOS/Swift] 1등 시민, 1급 객체함수 (First Class Citizen) (0) | 2023.01.18 |
댓글