@autoclosure

2025. 10. 10. 21:35·Programing Langauge/swift
반응형

🤖 @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) {
      ... 
}

출처

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

 

Documentation

 

docs.swift.org

 

반응형

'Programing Langauge > swift' 카테고리의 다른 글

@DynamicProperty  (0) 2025.10.24
@resultBuilder  (0) 2025.10.22
rethrows  (0) 2025.09.22
@retroactive  (0) 2025.08.23
@dynamicMemberLookup  (3) 2025.07.24
'Programing Langauge/swift' 카테고리의 다른 글
  • @DynamicProperty
  • @resultBuilder
  • rethrows
  • @retroactive
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (325) N
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (41)
        • swift (34)
        • python (6)
        • Kotlin (1)
      • iOS (133) N
        • UIKit (37)
        • Combine (1)
        • SwiftUI (33) N
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (20)
        • 어노테이션 (6)
        • 튜토리얼 (13)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
      • AI (9)
        • 이론 (9)
        • MCP (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    boostcamp
    Tuist
    lifecycle
    property
    concurrency
    투포인터
    dfs
    dp
    SwiftUI
    dispatch
    UIKit
    CS
    Swift
    백준
    IOS
    프로그래머스
    protocol
    AVFoundation
    GIT
    Spring
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
@autoclosure
상단으로

티스토리툴바