SwiftUI备选视图 - 协议类型'Any'无法符合'View',因为只有具体类型才能符合协议。

3
我可以帮您翻译,以下是翻译结果:

我有两个可重复使用的视图,Ex1和Ex2。我试图根据条件交替显示它们中的一个,但我无法做到。

ContentView:

struct ContentView: View {

    @State var selector = false
    var cvc = ContentViewController()

    var body: some View {
        ZStack { // ERROR: Protocol type 'Any' cannot conform to 'View' because only concrete types can conform to protocols

            cvc.getView(t: selector)

            Button(action: {
                self.selector.toggle()
                print(self.selector)
            }) {
                Text("Button")
            }
        }
        }
}

例1:

import SwiftUI

struct Ex1: View {
    var body: some View {
        Text("Ex 1")
    }
}

例 2:

import SwiftUI

struct Ex2: View {
    var body: some View {
        Text("Ex 2")
    }
}

ContentViewController :

import Foundation

class ContentViewController {

    let a = Ex1()
    let b = Ex2()

    func getView (t: Bool) ->(Any){
        if t {
            return a
        }
        else {
            return b
        }
    }
}

我认为这很简单,但对于我来说现在不是。请帮我两件事。

  1. 我想了解这个问题和解决方案。

  2. 在布局中交替显示两个视图的最佳方法。

谢谢提前。

1个回答

4
正如错误提示所示,ContentViewControllergetView 方法中指定的返回类型与协议不符。
在 SwiftUI 中,如果您不知道运行时可用的视图类型,则在 body{} 子句中指定的所有内容都必须是 View 类型。
对于未知视图,您可以指定 AnyView 类型。
因此,通过更改 ContentViewController 的代码,可以消除您的错误。
class ContentViewController {

    let a = Ex1()
    let b = Ex2()

    func getView (t: Bool) -> (AnyView) {
        if t {
            return AnyView(a)
        }
        else {
            return AnyView(b)
        }
    }
}

谢谢 @Kampai。加了 "import SwiftUI" 后它起作用了。 - undefined
非常好的回答,谢谢!也许值得一提的是,这基本上是对视图进行了类型擦除。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接