SwiftUI中的TupleView和AnyView是什么?

时间:2020-07-29 12:55:26

标签: ios xcode swiftui

在TupleView和AnyView之间感到困惑,有人可以详细解释TupleView和AnyView吗?

1 个答案:

答案 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特有的。 AnyCollectionAnySequence等扮演相同的角色。

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()
}