SwiftUI
SwiftUI - AnyView란 무엇인가?
버그잡이
2024. 6. 15. 20:59
AnyView란 무엇인가?
SwiftUI에서 개발하다 보면 함수에서 서로 다른 타입의 뷰를 리턴해야 하는 경우가 생깁니다.
이러한 상황에서 사용할 수 있는 것이 바로 'AnyView'입니다.
즉, 모든 종류의 뷰를 래핑할 수 있는 타입으로, 다양한 타입의 뷰를 하나의 타입으로 취급할 수 있게 해줍니다.
또한, 'AnyView'는 파라미터로 전달할 때도 유용하게 사용할 수 있습니다.
함수에 여러 종류의 뷰를 파라미터로 전달해야 할 때, 다양한 타입의 뷰를 하나의 파라미터 타입으로 처리할 수 있게 해줍니다.
struct CustomViewContainer: View {
let content: AnyView
var body: some View {
VStack {
Text("Header")
.font(.largeTitle)
content
Text("Footer")
.font(.footnote)
}
}
}
struct ContentView: View {
var body: some View {
VStack {
CustomViewContainer(content: AnyView(Text("Hello, World!").foregroundColor(.blue)))
CustomViewContainer(content: AnyView(Button(action: {
print("Button pressed")
}) {
Text("Press Me")
}))
}
}
}
AnyView를 지양해야하는 이유
AnyView는 성능 면에서 그다지 좋지 않습니다.
왜 그럴까요?
AnyView를 사용할 때마다 SwiftUI는 내부적으로 타입 정보를 잃어버리고, 이는 최적화 과정에서 불리하게 작용합니다.
구체적인 뷰 타입 정보를 알 수 없기 때문에, SwiftUI는 뷰 비교 계산 시 더 많은 연산을 수행해야 합니다.
AnyView 대체 방법
1. 함수일 때는 @ViewBuilder 사용
함수에서 서로 다른 타입의 뷰를 리턴해야 하는 상황에서는 @ViewBuilder를 사용할 수 있습니다. @ViewBuilder는 다양한 뷰를 하나의 반환 타입으로 취급할 수 있도록 도와주는 property wrapper입니다. 이를 통해 코드의 성능을 유지하면서도 유연성을 확보할 수 있습니다.
@ViewBuilder
func createView(isEnabled: Bool) -> some View {
if isEnabled {
AView()
} else {
BView()
}
}
2. 변수일 때는 Generic 사용
변수로 여러 타입의 뷰를 처리해야 할 때는 제네릭(generic)을 사용하는 것이 좋습니다. 제네릭을 사용하면 특정 타입에 구애받지 않고 다양한 뷰를 변수에 담을 수 있으며, 성능 면에서도 AnyView보다 유리합니다.
struct ContentView<Content: View>: View {
let content: Content
var body: some View {
VStack {
content
Text("This is a fixed text")
}
}
}
// 사용 예시
struct ParentView: View {
var body: some View {
ContentView(content: Text("Hello, World!"))
}
}
반응형