Programing Langauge/swift
@autoclosure
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 불가 (기본) | 기본적으로 @autoclosure는 non-escaping이라 함수가 리턴된 후엔 사용할 수 없음 |
만약, escpaing하고 싶다면, @autoclosure 앞에 @escaping을 붙히면됨
func ..(_ auto: @escaping @autoclosure () -> String) {
...
}
출처
Documentation
docs.swift.org
반응형