在TupleView和AnyView之间感到困惑,有人可以详细解释TupleView和AnyView吗?
答案 0 :(得分:1)
AnyView
是经过类型擦除的View
。克服某些类型系统限制是必要的。例如,以下内容不会编译:
import SwiftUI
struct SomeView: View {
@State private var showText: Bool
var body: some View {
if showText {
return Text("This is text.")
} else {
return Rectangle()
}
}
}
这是因为some View
要求在每种可能的情况下都返回相同的具体View
类型。在一种情况下,我们无法返回Text
,在另一种情况下,我们无法返回Rectangle
或其他任何东西。
我们也不能使用View
(没有some
),因为具有关联类型的协议也不能用作具体类型。
这是AnyView
进行救援的地方:
import SwiftUI
struct SomeView: View {
@State private var showText: Bool
var body: some View {
if showText {
return AnyView(Text("This is text."))
} else {
return AnyView(Rectangle())
}
}
}
通常,只要想隐藏具体类型并只返回AnyView
,就可以使用View
。这不是SwiftUI特有的。 AnyCollection
,AnySequence
等扮演相同的角色。
TupleView
是一种具体的View
类型,用于存储多个View
值。它很少使用,主要是由图书馆开发人员用于实现view builders,如下所示:
struct MyView: View {
init<C0, C1>(
@ViewBuilder _ content: @escaping () -> TupleView<(C0, C1)>
) where C0: View, C1: View {
let content = content().value
// do something with content
}
// implement the rest of the view
}
MyView
现在可以与特殊语法一起使用,如下所示:
MyView {
View1()
View2()
}