프로그래밍iOS 개발자, Junior/Middle

Swift에서 trailing closure syntax란 무엇이며, 왜 도입되었고, 그 특징과 제한 사항은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문 배경: Trailing closure syntax는 함수의 끝에서 클로저(block)를 사용할 때 코드 가독성을 높이기 위해 Swift에서 도입된 구문 구조입니다. 이는 특히 함수형 및 선언적 스타일에서 대규모 및 중첩 클로저 작업을 쉽게 만들어 줍니다.

문제: 여러 괄호로 클로저를 선언하는 표준 방식은 코드의 визу적 구조를 복잡하게 만들고 이해하기 어렵게 만듭니다:

UIView.animate(withDuration: 0.3, animations: { ... })

클로저의 크기가 커짐에 따라 이 코드는 가독성이 떨어지게 됩니다.

해결책: Swift는 마지막 인자 함수를 괄호 밖으로 꺼내는 것을 허용합니다:

UIView.animate(withDuration: 0.3) { // 애니메이션 블록 }

클로저가 두 개 이상일 경우 trailing closure syntax는 마지막 클로저 매개변수에만 적용 가능하며, 나머지는 괄호 안에 포함되어야 합니다.

주요 특징:

  • 클로저가 있는 코드의 가독성을 높임
  • 특히 함수형 및 선언적 DSL(SwiftUI, UIKit 애니메이션)과 작업할 때 유용
  • 함수의 마지막 클로저 매개변수에만 제한됨

함정 질문들.

클로저가 함수의 마지막 매개변수가 아닐 경우 trailing closure syntax를 사용할 수 있나요?

아니요, 마지막 매개변수만 trailing closure로 작성할 수 있습니다. 여러 개의 클로저가 필요한 경우, 마지막 클로저만 괄호 밖으로 꺼낼 수 있으며, 나머지는 괄호 안에서 전달됩니다.

func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }

하나의 클로저 인자를 가진 메소드를 호출할 때 괄호를 생략할 수 있나요?

네, 함수가 유일한 인자로 클로저를 받는 경우 괄호를 생략할 수 있습니다:

func doWork(action: () -> Void) doWork { print("작업") }

variation 인자를 클로저 뒤에 설정할 수 있습니까?

아니요, trailing closure syntax는 클로저가 마지막 인자일 경우에만 적용됩니다. 그 뒤에는 variadic이나 다른 매개변수가 올 수 없습니다. 다음은 오류를 발생시킵니다:

func test(x: () -> Void, y: Int...) // ... trailing closure로 호출 불가능

일반적인 오류 및 안티 패턴

  • 클로저 매개변수의 순서를 혼동하여 마지막 클로저가 아닐 때 꺼내려고 함
  • 익명 클로저를 너무 복잡하게 남겨 가독성을 떨어트림
  • trailing closure를 단기 클로저와 같은 상황에서 사용하여 PR 리뷰를 악화시킴

실생활 예시

부정적인 케이스

두 개의 클로저 매개변수로 호출되며 trailing syntax 없이 작성되어 메소드가 수직으로 5화면을 차지하고 이해하기 어려움이 증가합니다.

장점:

  • 각 클로저를 명시적으로 지시

단점:

  • 가독성 저하, 괄호 중복

긍정적인 케이스

UICollectionViewCompositionalLayout의 구현에서 trailing closure가 사용되어 레이아웃 블록이 읽기 쉽게 되어 있으며, 구조가 시각적으로 레이아웃 구성 요소의 계층을 보여줍니다.

장점:

  • 인식 개선, 빠른 리뷰

단점:

  • 비표준 구문에 익숙해지는 것이 초보자에게 필요함