SwiftUI iOS 18 신기능: @Entry 매크로로 커스텀 EnvironmentValues 한 줄로 정의하기
iOS 18부터 SwiftUI의 EnvironmentValues 확장 방식이 크게 단순화되었습니다. 기존에는 뷰 계층 구조 전체에 전달할 커스텀 환경 변수를 정의하기 위해 EnvironmentKey 프로토콜을 선언하고 getter와 setter 연산 프로퍼티를 일일이 작성해야 했습니다. iOS 18에 새롭게 도입된 @Entry 매크로를 사용하면 이러한 보일러플레이트 코드 없이 선언적으로 환경 변수를 작성할 수 있습니다. 기존 방식과의 코드 구조 비교 및 실무 적용 패턴은 다음과 같습니다.
1. 기존 EnvironmentKey 정의 방식의 불편함
iOS 18 이전에는 커스텀 키를 선언하기 위해 커스텀 타입을 정의한 후, EnvironmentValues에 연산 프로퍼티를 연결하는 장황한 코드가 필요했습니다.
// 1. EnvironmentKey 프로토콜을 구현하는 타입 생성
private struct CustomThemeKey: EnvironmentKey {
static let defaultValue: String = "Light"
}
// 2. EnvironmentValues 확장 및 getter/setter 구현
extension EnvironmentValues {
var customTheme: String {
get { self[CustomThemeKey.self] }
set { self[CustomThemeKey.self] = newValue }
}
}
이 방식은 단 하나의 커스텀 환경 변수를 추가하기 위해서도 불필요한 전용 struct와 키 매핑 구문을 매번 새로 작성해야 하는 보일러플레이트(Boilerplate) 문제가 있었습니다.
2. iOS 18+ @Entry 매크로를 활용한 한 줄 선언
iOS 18에서는 @Entry 매크로가 도입되어 EnvironmentValues 확장 내부에 기본값(Default Value)과 함께 변수를 선언하는 것만으로 키 생성과 Accessor 매핑이 자동 완료됩니다.
// iOS 18+ @Entry 매크로 적용 방식
extension EnvironmentValues {
@Entry var customTheme: String = "Light"
}
- 보일러플레이트 제거: 별도의 EnvironmentKey 타입을 만들지 않아도 컴파일러가 매크로를 통해 전용 키 타입 및 연산 프로퍼티를 자동 생성합니다.
- 기본값 지정: 변수 선언 시 할당한 초깃값이 환경 변수의 기본값(defaultValue)으로 자동 지정됩니다.
3. 커스텀 EnvironmentValues 정의 및 뷰 적용 실무 예제
@Entry 매크로로 정의한 커스텀 환경 변수는 기존과 동일하게 .environment() 수정자 및 @Environment 프로퍼티 래퍼를 사용해 뷰 계층에 적용할 수 있습니다.
import SwiftUI
// 1. 커스텀 환경 변수 선언
extension EnvironmentValues {
@Entry var userRole: String = "Guest"
}
// 2. 하위 뷰에서 환경 변수 읽기
struct ProfileView: View {
@Environment(\.userRole) private var userRole
var body: some View {
Text("현재 사용자 권한: \(userRole)")
}
}
// 3. 상위 뷰에서 커스텀 환경 변수 주입
struct ContentView: View {
var body: some View {
ProfileView()
.environment(\.userRole, "Admin")
}
}
4. 기존 방식 vs @Entry 매크로 비교 요약
| 구분 | 기존 방식 (iOS 17 이하) | @Entry 매크로 방식 (iOS 18+) |
| 코드 구조 | EnvironmentKey 타입 선언 + EnvironmentValues 확장 | EnvironmentValues 확장 내 @Entry 선언 |
| 작성 코드량 | 최소 8~10줄 이상 | 단 1줄 |
| 기본값 설정 | EnvironmentKey.defaultValue에 명시 | 변수 초깃값 할당으로 자동 지정 |
| 가독성 및 유지보수 | 불필요한 전용 struct 타입 양산 | 선언 직관성 대폭 향상 |
(출처: Apple Developer Documentation - EnvironmentValues & @Entry)
5. 핵심 요약
iOS 18의 @Entry 매크로는 SwiftUI 환경 변수 작성 시 반복되던 보일러플레이트 코드를 단 한 줄로 축소하여 뷰 계층 간 상태 전달 코드의 가독성과 개발 생산성을 획기적으로 향상시킵니다.
#SwiftUI #iOS18 #Entry매크로 #EnvironmentValues #EnvironmentKey #SwiftUI신기능 #WWDC #Swift매크로 #iOS개발자


