2. Self.Body를 쓰는 이유
public protocol View {
associatedtype Body : View
@ViewBuilder @MainActor @preconcurrency var body: Self.Body { get }
}View는 associatedtype 기반이라 body는 "어떤 View든"이 아니라 "이 타입이 정한 구체 Body"여야 한다.
some View를 쓰는 이유"왜 굳이 some을 쓰는가"를 문법 설명이 아니라 타입 시스템 관점에서 정리한다. 핵심은 표기는 숨기고 컴파일러 타입 정보는 유지다.
2026-04-30
public protocol View {
associatedtype Body : View
@ViewBuilder @MainActor @preconcurrency var body: Self.Body { get }
}View는 associatedtype 기반이라 body는 "어떤 View든"이 아니라 "이 타입이 정한 구체 Body"여야 한다.
var body: View로 쓰면 existential(타입 소거) 의미가 강해진다. SwiftUI는 뷰 트리의 구체 타입 정보를 활용해 diff/최적화를 한다.
@ViewBuilder
var content: some View {
if isLoading {
ProgressView()
} else {
Text("Done")
}
}분기마다 반환 뷰 타입이 달라도, 빌더가 내부적으로 단일 합성 타입(ConditionalContent 등)으로 묶어줘서 some View 규칙을 만족시킨다.
| 항목 | some View | AnyView / any View |
|---|---|---|
| 타입 정보 | 컴파일 타임 유지 | 소거됨 |
| 주 용도 | 기본 body 반환 | 동적 슬롯/이종 컬렉션 |
| 비용 | 낮은 편 | 추가 추상화 비용 가능 |
| 질문 | 핵심 답 |
|---|---|
| "컴파일에는 알리고 표기상 숨긴다"는 뜻? | 맞다. 외부 API 표면은 단순화하고, 컴파일러 타입 정보는 유지한다. |
| some은 쓸일이 없지 않나? | 앱 내부 일반 코드에선 적을 수 있지만 SwiftUI body/API 반환에서는 핵심 패턴이다. |
| var body: some View여야 하는 이유? | View 프로토콜의 associatedtype 요구를 만족하면서도 구체 타입 노출을 피하기 위해서다. |
any / some / Generic / Dispatch 쉽게 이해하기
Protocol Oriented Programming Master