Tech Log/iOS

SwiftUI의 some View / any View / AnyView 차이 정리

별똥별 ⭐️ 2026. 3. 12. 14:41
728x90

1. some View 

- "반환값이 View다" 정도로만 보면 부족하다

- 정확히는 "컴파일러는 이 함수가 반환하는 구체적인 View 타입을 알고 있지만, 바깥에는 숨긴다"

- 핵심은 하나의 구체 타입이 정해져 있다는 점

- 예를 들어 내부가 TextVStack이든 modifier가 붙은 복잡한 타입이든, 컴파일 시점에는 이미 확정되어 있다.

- 그래서 some View는 타입 정보를 유지한다.

 

2. any View

- "이 값은 View 프로토콜을 따르는 값이다."

- View 프로토콜을 채택한 어떤 타입의 인스턴스든 담을 수 있다.

- some View가 "구체 타입은 잇지만 숨김" 이라면, any View는 "구체 타입을 하나로 고정하지 않고, View 프로토콜을 따르는 값을로 다룸"에 가깝다.

- 그래서 타입 정보가 더 추상화된다.

 

/// some View
let a: some View = Text("Hello")

/// any View
let b: any View = Text("Hello")

 

- a는 내부적으로 구체 타입이 확정된 상태 (Text)

- b는 Text라는 구체 타입보다는 "View를 따르는 값"으로 다루는 쪽

즉, any View는 View 프로토콜을 만족하는 임의의 값을 프로토콜 타입으로 다루는 방식.

3. AnyView

- 이건 SwiftUI가 제공하는 타입 소거 Wrapper

- 서로 다른 구체 View 타입을 하나의 공통 타입으로 감싸서 다룰 수 있게 함

- 예를 들어 TextImage를 같은 반환 타입으로 맞춰야 할 때 AnyView(Text(...)), AnyView(Image(...))처럼 감쌀 수 있음

- 대신 감싸는 순간 원래의 구체 타입 정보는 잃음

 

  한 줄로 비교하면 이렇습니다.

 

  - some View: 구체 타입은 있음, 다만 감춤

  - any View: View 프로토콜 자체를 값처럼 다룸

  AnyView: SwiftUI에서 View를 실제로 타입 소거해서 담는 박스

 

  그리고 사용 감각은 보통 이렇게 가져가면 됩니다.

 

  - 기본은 some View

  - any View는 Swift 언어 개념을 이해할 때

  - AnyView는 정말 여러 View 타입을 하나로 묶어야 할 때만

 

  오해하기 쉬운 부분 하나만 더 짚으면,

  some View는 “뷰 컨테이너로 묶인다”가 본질은 아닙니다. 그건 @ViewBuilder 쪽 설명에 더 가깝습니다.

 

  - some View는 반환 타입을 감추는 방식

  - @ViewBuilder는 여러 뷰나 if 분기를 하나의 View 문맥으로 조립하는 방식

 

  즉:

 

  - some View = 반환 타입의 성격

  - @ViewBuilder = body 내부 코드를 조립하는 방식