Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- url 추적
- List
- swift
- development language
- DataBinding
- Swift Package Manager
- ViewBuilder
- base64 변환
- notifychanged
- scrolling tab
- Android
- 기존 앱
- DevelopmentRegion
- convert base64
- Side Menu
- pod install
- ios
- oberve url
- 상단 탭바
- SwiftUI
- Tuist
- swift #swift keychain #keychain 사용법
- detect url
- 스크롤 탭
- UIViewControllerTransitioningDelegate
- url 관찰
- transformation.map
- 개발자 면접
- GeometryReader
- UIPresentationController
Archives
- Today
- Total
버그 잡이
SwiftUI - AnyView란 무엇인가? 본문
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!"))
}
}
반응형
'SwiftUI' 카테고리의 다른 글
SwiftUI - ObservableObject vs StateObject (1) | 2024.06.16 |
---|---|
SwiftUI 성능 이해 및 최적화 방법 알아보기 (1) | 2024.06.07 |
SwiftUI List 기본 스타일 지우기 (0) | 2024.03.01 |
SwiftUI - List에서 원하는 Row로 스크롤 하기 #scrollTo (0) | 2023.07.29 |
SwiftUI - scrollIndicators() 로 textEditor 스크롤바 hidden 처리하기 (0) | 2023.06.18 |
Comments