TupleView 和 AnyView 之间很困惑,有人能详细解释 TupleView 和 AnyView 吗?
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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为some View要求View在每种可能的情况下都返回相同的具体类型。Text在一种情况下我们无法返回,Rectangle在另一种情况下我们无法返回。
我们也不能使用View(without 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())
}
}
}
Run Code Online (Sandbox Code Playgroud)
一般来说,AnyView只要你想隐藏具体类型并返回即可使用View。这并不是 SwiftUI 独有的。 AnyCollection等AnySequence发挥相同的作用。
TupleViewView是用于存储多个值的具体类型View。它很少使用,主要由库开发人员用于实现视图构建器,如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
MyView现在可以与特殊语法一起使用,如下所示:
MyView {
View1()
View2()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1794 次 |
| 最近记录: |