SwiftUI 中的 TupleView 和 AnyView 是什么?

Mil*_*mar 1 xcode ios swiftui

TupleView 和 AnyView 之间很困惑,有人能详细解释 TupleView 和 AnyView 吗?

Ivi*_* M. 9

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 独有的。 AnyCollectionAnySequence发挥相同的作用。

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)