Hamp 2025. 10. 10. 21:35
반응형

🤖 @autoclosure

 

🏋️ 역할

 

함수 인자로 전달되는 표현식을 자동으로 클로저로 감싸주는 속성(attribute)

지연 평가 (lazy evaluation)를 가능하게 해주는 문법적 편의 장치

 

🧬 탄생 계기

 

swift함수는 모든 인자를 미리 평가(eager evaluation) 한다.

그래서 다음과 같은 코드를 실행하면, heavyComputation의 결과가 false여도, 이미 실행이됨

 

func debugLog(_ message: String) {
    if isDebug {
        print(message)
    }
}

debugLog("결과: \(heavyComputation())")

 

일시적인 해결방법으로는 아래와 같이 클로저로 감싸야했다.

이렇게 되면, 호출하기 전까지는 실행되지 않음

func debugLog(_ message: () -> String) {
    if isDebug {
        print(message())
    }
}

 

하지만 외부에서 쓸 때,  클로저 표현을 위해 { }가 계속 따라다녀야 했음

debugLog({ "결과: \(heavyComputation())" })

 

@autoclosure는 그래서 표현식만 넣어주면, 알아서 {}를 감싸줌

 

⭐️ 특징

 

1. autoclosure은 argument를 가지지 않고, 반드시 리턴 값이 있어야함.

 

2. closure를 콜하기 전까지는 코드가 실행되지 않기 떄문에, 계산 비용이 무거운 동작에 유용함

 

😀 장점

🧹 가독성 향상 클로저 문법({})을 직접 쓰지 않아도 되어 코드가 깔끔해짐
지연 평가(lazy evaluation) 함수 내부에서 필요할 때만 표현식을 평가할 수 있음
🧠 조건부 실행에 유용 assert, precondition, fatalError 같은 함수들이 이걸 활용함
💡 비용이 큰 연산의 최적화 필요할 때만 실행되므로 퍼포먼스 개선 가능

 

 

⚠️ 단점 및 주의사항

🧩 클로저임을 숨김 호출하는 쪽에서 클로저라는 사실이 드러나지 않아 실행 시점이 헷갈릴 수 있음
🚫 escaping 불가 (기본) 기본적으로 @autoclosurenon-escaping이라 함수가 리턴된 후엔 사용할 수 없음

 

만약, escpaing하고 싶다면, @autoclosure 앞에 @escaping을 붙히면됨

func ..(_ auto: @escaping @autoclosure () -> String) {
      ... 
}

출처

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/#Autoclosures

 

Documentation

 

docs.swift.org

 

반응형