Hacking with Swift 사이트의 강좌 번역본입니다.
[원문 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-return-different-view-types]
How to return different view types
뷰의 body로부터 some View를 반환할때, Swift는 하나의 특정 반환 타입이 있는 것을 의미한다는 것을 알고 있습니다. 예를들어, 동전을 뒤집어서 you wont! 이미지나 Better luck next time라는 텍스트를 보여주고자 하는 경우에, 다음과 같이 작성할 수 없습니다.
var body: some View {
if Bool.random() {
Image("example-image")
} else {
Text("Better luck next time")
}
}
이미지나 텍스트 뷰 중에 하나를 반환하는 것이 허용되지 않습니다 - 정확히 하나의 타입만 반환해야 합니다.
이를 고칠수 있는 2가지 방법이 있습니다. 첫번째 옵션은 그룹(group) 안으로 출력을 감싸는(wrap) 것이며, 그룹 안에서 이미지 또는 텍스트 뷰를 전달하든 상관 없습니다.
var body: some View {
Group {
if Bool.random() {
Image("example-image")
} else {
Text("Better luck next time")
}
}
}
또는, SwiftUI는 반환하는데 사용할 수 있는 타입을 제거해주는 래퍼(wrapper)인 AnyView를 제공합니다.
var body: some View {
if Bool.random() {
return AnyView(Image("example-image"))
} else {
return AnyView(Text("Better luck next time"))
}
}
해당 개념에 대해서 들어 본적이 없다면, Swift가 AnyView 내부에 어떤 특정 타입이 있다는 것을 잊어버리게 하며, 그것들이 똑같아 보이도록 합니다. 이는 성능상 문제가 될수 있기에 자주 사용하지 마세요.
Group와 AnyView 모두 레이아웃에 대해 동일한 결과를 얻지만, SwiftUI에 더 효율적이기 때문에, 일반적으로 Group를 사용하는 것이 좋습니다.
'SwiftUI > View layout' 카테고리의 다른 글
How to provide relative sizes using GeometryReader (0) | 2019.11.15 |
---|---|
How to give a view a custom frame (0) | 2019.11.15 |
How to create different layouts using size classes (0) | 2019.11.15 |
How to create views in a loop using ForEach (0) | 2019.11.15 |
How to change the order of view layering using Z index (0) | 2019.11.14 |
How to layer views on top of each other using ZStack (0) | 2019.11.14 |
How to make a fixed size Spacer (0) | 2019.11.14 |
How to force views to one side inside a stack using Spacer (0) | 2019.11.14 |