본문 바로가기
iOS/Swift

[iOS/Swift] 클로저 표현식을 간단하게! 문법 경량화

by iosdevlime 2023. 1. 27.

클로저 관련 포스팅 세 번째 시간입니다! 🤪

 

클로저 표현식(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 문법을 다루며 추가적으로 포스팅 하도록 하겠습니다.

댓글