카테고리 없음

SwiftUI: @ViewBuilder

ragdoll-cat 2025. 3. 10. 21:57

📌 @ViewBuilder란?


@ViewBuilder는 SwiftUI에서 여러 개의 뷰를 하나의 반환 값으로 묶어주는 속성 래퍼(Attribute Wrapper)입니다. Swift의 함수는 기본적으로 단일 반환 값을 요구하지만, @ViewBuilder를 사용하면 여러 개의 뷰를 조합하여 반환할 수 있습니다.

 


✅ @ViewBuilder 기본 사용법

import SwiftUI

struct MyView: View {
  var body: some View {
    customView()
  }

  @ViewBuilder
  func customView() -> some View {
    Text("Hello, SwiftUI!")
    Text("This is using @ViewBuilder.")
  }
}

 

  • @ViewBuilder 덕분에 customView()에서 여러 개의 Text를 반환할 수 있습니다.
  • 일반적인 Swift 함수는 하나의 값만 반환해야 하지만, @ViewBuilder를 사용하면 여러 개의 뷰를 하나의 View처럼 처리할 수 있습니다.

🔄 조건문과 함께 사용

 

  • if-else를 활용하여 동적으로 다른 뷰를 반환할 수 있습니다.
  • @ViewBuilder가 없으면 if와 else에서 같은 타입의 뷰를 반환해야 하지만, @ViewBuilder 덕분에 서로 다른 구조를 가질 수 있습니다.

🔄 Switch문과 함께 사용

enum Status {
  case loading, success, error
}

@ViewBuilder
func statusMessageView(status: Status) -> some View {
  switch status {
  case .loading:
    ProgressView()
    Text("Loading...")
  case .success:
    Text("✅ Load Successful!")
  case .error:
    Text("❌ Load Failed. Try again.")
  }
}
  •  switch문을 활용하여 다양한 상태에 따라 다른 뷰를 반환할 수 있습니다.

⚠️ @ViewBuilder 사용 시 주의할 점

1. 뷰 개수가 많을 경우 Group 사용

  • @ViewBuilder는 내부적으로 최대 10개의 뷰만 허용합니다.
  • 이를 해결하려면 Group {}을 사용해야 합니다.

 2. ForEach에서 일반 for루프 사용 불가
- @ViewBuilder 내부에서는 일반적인 for 루프를 사용할 수 없습니다.
- 대신 ForEach를 사용해야 합니다.

❌ 
@ViewBuilder
func wrongLoopView() -> some View {
  for i in 1...5 {
    Text("Item \(i)") // 컴파일 에러 발생!
  }
}

✅ 
@ViewBuilder
func correctLoopView() -> some View {
  ForEach(1...5, id: \ .self) { i in
    Text("Item \(i)")
  }
}


3. some View 반환 타입 필수

  • @ViewBuilder를 적용한 함수는 반드시 some View를 반환해야 합니다.
  • some View를 생략하면 컴파일 에러가 발생할 수 있습니다.