SwiftUI Type System

SwiftUI에서 some View를 쓰는 이유

"왜 굳이 some을 쓰는가"를 문법 설명이 아니라 타입 시스템 관점에서 정리한다. 핵심은 표기는 숨기고 컴파일러 타입 정보는 유지다.

학습 날짜

2026-04-30

1. 결론 먼저

  1. some View는 구체 타입 표기를 감춘다.
  2. 하지만 컴파일러는 실제 구체 타입을 정확히 안다.
  3. 그래서 API는 단순하고, 타입 안정성과 최적화 여지는 유지된다.

2. Self.Body를 쓰는 이유

public protocol View {
    associatedtype Body : View
    @ViewBuilder @MainActor @preconcurrency var body: Self.Body { get }
}

View는 associatedtype 기반이라 body는 "어떤 View든"이 아니라 "이 타입이 정한 구체 Body"여야 한다.

3. 왜 그냥 View가 아닌가

var body: View로 쓰면 existential(타입 소거) 의미가 강해진다. SwiftUI는 뷰 트리의 구체 타입 정보를 활용해 diff/최적화를 한다.

4. @ViewBuilder가 "합성 타입" 만든다는 뜻

@ViewBuilder
var content: some View {
    if isLoading {
        ProgressView()
    } else {
        Text("Done")
    }
}

분기마다 반환 뷰 타입이 달라도, 빌더가 내부적으로 단일 합성 타입(ConditionalContent 등)으로 묶어줘서 some View 규칙을 만족시킨다.

5. any View / AnyView와 비교

항목some ViewAnyView / any View
타입 정보컴파일 타임 유지소거됨
주 용도기본 body 반환동적 슬롯/이종 컬렉션
비용낮은 편추가 추상화 비용 가능

6. 실무 규칙

  1. 기본은 some View.
  2. 분기/조합은 @ViewBuilder로 해결.
  3. 정말 동적 타입 슬롯이 필요할 때만 AnyView 검토.

7. 최근 질문 Q&A

질문핵심 답
"컴파일에는 알리고 표기상 숨긴다"는 뜻?맞다. 외부 API 표면은 단순화하고, 컴파일러 타입 정보는 유지한다.
some은 쓸일이 없지 않나?앱 내부 일반 코드에선 적을 수 있지만 SwiftUI body/API 반환에서는 핵심 패턴이다.
var body: some View여야 하는 이유?View 프로토콜의 associatedtype 요구를 만족하면서도 구체 타입 노출을 피하기 위해서다.

관련 문서

any / some / Generic / Dispatch 쉽게 이해하기
Protocol Oriented Programming Master