SwiftUI - PageView - 传递不同的视图

SwiftUI - PageView - Pass in different Views

我通过线程在 SwiftUI 中成功实现了 PageView:

只要所有视图都具有相同的结构,通过数组传递多个视图就很有魅力。
PageView([TestView(), TestView()]).
不过,我想传递不同的看法。
PageView([TestView(), AnotherView(), DifferentView()])

所有视图均为 SwiftUI 类型:
struct NAME : View { code }

当我尝试向数组添加不同的结构时,我收到以下错误消息:

var pageViewViewArray = [TestView(), AnotherView(), DifferentView()]

Heterogeneous collection literal could only be inferred to '[Any]'; add explicit type annotation if this is intentional.
Insert' as [Any]

将其转换为:

var pageViewViewArray = [TestView(), AnotherView(), DifferentView()] as! [Any]
PageView(pageViewViewArray)

PageView 会说:

Protocol type 'Any' cannot conform to 'View' because only concrete types can conform to protocols

如果有任何想法,我将不胜感激。

通过将每个视图强制转换为 AnyView:

来尝试使用类型擦除
var pageViewViewArray: [AnyView] = [AnyView(TestView()), AnyView(AnotherView()), AnyView(DifferentView())]

文档 here, and an example of using it here.

有一种更有效的方法,无需类型擦除。您应该创建一个公共视图,在其中注入一个枚举值,然后根据该值 return 一个所需的视图。请看下面的示例:

/// The first type of a view that accepts and shows a number
struct ViewA: View {

    let number: Int

    var body: some View {
        Text("\(number)")
    }
}

/// The second type of a view that accepts and shows a string
struct ViewB: View {

    let string: String

    var body: some View {
        Text(string)
    }
}

/// An enum type used for dependency injection
enum ViewType {

    case viewA(number: Int)
    case viewB(string: String)
}

/// A common view which internally handles different kind of views based on injected enum value
struct CommonView: View {

    let viewType: ViewType

    var body: some View {
        switch viewType {
        case .viewA(let number):
            ViewA(number: number)

        case .viewB(let string):
            ViewB(string: string)
        }
    }
}

// Views used for page view controller, that are now of same type:
var pageViewViewArray = [
    CommonView(viewType: .viewA(number: 1)),
    CommonView(viewType: .viewB(string: "Hello, World!"))
]