버그 잡이

SwiftUI - AnyView란 무엇인가? 본문

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!"))
    }
}

 

 

 

반응형
Comments