Menu
Coddy logo textTech

후행 클로저

Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 39번째.

클로저가 함수의 마지막 인수인 경우, 소괄호 밖에 작성할 수 있습니다. 이것이 후행 클로저(trailing-closure) 형식이며, Swift 코드가 자연스럽게 읽히는 방식입니다.

let nums = [1, 2, 3]
// 표준 형식
let a = nums.map({ $0 * 2 })
// 후행 클로저 형식
let b = nums.map { $0 * 2 }

클로저가 유일한 인수인 경우, 괄호도 사라집니다. 그래서 지금까지 보신 모든 것이 사용자 정의 제어 구조처럼 읽히는 것입니다.

동일한 방식으로 클로저를 받는 자신만의 함수를 작성할 수 있습니다:

func repeatN(_ n: Int, action: () -> Void) {
    for _ in 0..<n {
        action()
    }
}
repeatN(3) {
    print("hi")
}

후행 클로저(trailing-closure) 형식은 repeatN(3) { ... } 코드가 내장 루프처럼 읽히게 만듭니다. 직접 만든 제어 구조가 표준 라이브러리에 있는 것들과 똑같이 보이게 하는 것이 바로 이 기능의 핵심입니다.

challenge icon

챌린지

쉬움

다음과 같은 함수 collect를 정의하세요:

  • 정수 n과 클로저 builder: (Int) -> String를 인자로 받습니다.
  • 1부터 n까지(포함)의 각 i에 대해 builder를 호출하고, 그 결과 문자열들의 배열을 반환합니다.

stdin에서 정수를 읽고, 각 값에 대해 "i=<i>"를 생성하는 후행 클로저를 사용하여 collect를 호출한 뒤, 그 결과를 ,로 연결하여 출력하세요.

입력이 4인 경우, 출력은 i=1,i=2,i=3,i=4입니다.

치트 시트

후행 클로저 구문(Trailing closure syntax): 클로저가 마지막 인자인 경우, 괄호 밖에 작성할 수 있습니다. 만약 클로저가 유일한 인자라면 괄호를 완전히 생략할 수 있습니다.

let nums = [1, 2, 3]
let a = nums.map({ $0 * 2 }) // 표준
let b = nums.map { $0 * 2 }  // 후행 클로저

사용자 정의 함수도 같은 방식으로 클로저를 받아들일 수 있어, 내장 제어 구조처럼 읽히게 만들 수 있습니다:

func repeatN(_ n: Int, action: () -> Void) {
    for _ in 0..<n {
        action()
    }
}
repeatN(3) {
    print("hi")
}

직접 해보기

let n = Int(readLine()!)!

// TODO: func collect(_ n:Int, builder:(Int)->String) -> [String]
// 그런 다음 collect(n) { ... }을 호출하고 ","로 연결하여 출력하세요.
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨