languages/swift

Trailing closure - 후행 클로저

uzzam 2023. 4. 6. 01:13
struct widget: Widget {
    let kind: String = "widget"

    var body: some WidgetConfiguration {
        IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
            widgetEntryView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
        
    }
}

스위프트로 위젯 익스텐션을 추가 중 특이한 문법을 발견했다.

IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
            widgetEntryView(entry: entry)
        }

이 부분인데, 마지막 { entry in widgetEntryView(entry: entry) } 는 대체 뭘까..

스위프트는 전혀 모르지만 그 동안 내가 보아왔던 언어들을 생각해보면

IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider(), content: { entry in
            widgetEntryView(entry: entry)
        })​

이런식으로 생성자 안에는 들어가 있어야 하지 않나 싶었다.

 

이 문법은 trailing closure, 후행 클로저라고 한다.

마지막 인자가 클로저라면 괄호를 벗어나서 작성해도 된다고 한다.

물론 괄호 안에 써도 상관없다.

func test(f: () -> Void) {
  print("테스트")
}

test() {
  print("테스트")
}

func test2(f: () -> Void) {
  print("테스트2")
}

test2(f: {print("테스트")})
 
func test3(f: () -> Void) {
  print("테스트3")
}

test3 {

}

이렇게 함수를 호출할 수 있다.

특히 마지막 같은 경우는 함수를 기존에 알던 test() 가 아닌, test{} 라고 호출하는 모양이어서 어색하다.