1. 트레일링 클로저(후행 클로저)

함수의 마지막 파라미터가 클로저일 때,이를 파라미터 값 형식이 아닌 함수 뒤에 붙여 작성하는 문법

이때, Argument Label은 생략된다.

아래 예시들을 통해서 확인해보자!

i) 파라미터가 클로저 한개인 함수

우리는 클로저가 1급 객체인 것을 알고 있으니 → 파라미터로 클로저를 받을 수 있다는 것도 다 알고 있을거얌! 이때 우리는 아래와 같이 코드를 작성할 수 있찌~!

func doSomething(closure: () -> ()) {
    closure()
}

doSomething(closure: { () -> () in
    print("Hello!")
})

근데 솔직히 말해서.. 가독성이 너무 떨어진다는 생각 안드니..? 일단 }) 이런거도 헷갈리고

⇒ 그래서 이렇게 클로저 한개를 파라미터로 받는 함수에서는 파라미터를 묶는 소괄호를 앞으로 빼서 표현이 가능하다!

⇒ 그리고 이 과정에서 closure라는 ArgumentLabel은 생략이 된다!

+) 만약 모든 파라미터를 다 합쳐서.. 진짜 클로저 한개밖에 없다? → 소괄호도 생략이 가능하다!

func doSomething(closure: () -> ()) {
    closure()
}

doSomething { () -> () in
    print("Hello!")
}

ii) 파라미터가 클로저 여러개인 함수

아래와 같이 파라미터가 여러개인 함수도 우리는 트레일링 클로져를 활용해서 조금 더 가독성을 높일 수 있다!

func fetchData(success: () -> (), fail: () -> ()) {
    //do something...
}

fetchData(success: { () -> () in
    print("Success!")
}, fail: { () -> () in
    print("Fail!")
})
  1. success 클로저를 → 소괄호 앞으로 빼서 표현을 한다.
  2. 이 과정에서 fail이라는 ArgumentLabel은 생략이 된다.
  3. 단! 지금 파라미터가 2개 즉 1개 이상임으로소괄호는 맘대로 생략하면 안된다!!

이렇게 아래와 같은 코드가 나오게 된다~!

fetchData(success:  { () -> () in
    print("Success!")
}) { () -> () in
    print("Fail!")
}

2. 클로저의 경량 문법