질문 배경: Trailing closure syntax는 함수의 끝에서 클로저(block)를 사용할 때 코드 가독성을 높이기 위해 Swift에서 도입된 구문 구조입니다. 이는 특히 함수형 및 선언적 스타일에서 대규모 및 중첩 클로저 작업을 쉽게 만들어 줍니다.
문제: 여러 괄호로 클로저를 선언하는 표준 방식은 코드의 визу적 구조를 복잡하게 만들고 이해하기 어렵게 만듭니다:
UIView.animate(withDuration: 0.3, animations: { ... })
클로저의 크기가 커짐에 따라 이 코드는 가독성이 떨어지게 됩니다.
해결책: Swift는 마지막 인자 함수를 괄호 밖으로 꺼내는 것을 허용합니다:
UIView.animate(withDuration: 0.3) { // 애니메이션 블록 }
클로저가 두 개 이상일 경우 trailing closure syntax는 마지막 클로저 매개변수에만 적용 가능하며, 나머지는 괄호 안에 포함되어야 합니다.
주요 특징:
클로저가 함수의 마지막 매개변수가 아닐 경우 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 syntax 없이 작성되어 메소드가 수직으로 5화면을 차지하고 이해하기 어려움이 증가합니다.
장점:
단점:
UICollectionViewCompositionalLayout의 구현에서 trailing closure가 사용되어 레이아웃 블록이 읽기 쉽게 되어 있으며, 구조가 시각적으로 레이아웃 구성 요소의 계층을 보여줍니다.
장점:
단점: