我正在尝试将视图传递到用于创建选项卡的结构中,该代码如下:
struct TabItem: TabView {
var tabView: View
var tabText: String
var tabIcon: String
var body: some View {
self.tabView.tabItem {
Text(self.tabText)
Image(systemName: self.tabIcon)
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
TabView {
TabItem(tabView: SimpleCalculatorView(), tabText: "Home", tabIcon: "house")
}
}
}
}
我得到的错误如下:
协议“视图”只能用作通用约束,因为它具有“自我”或相关的类型要求
答案 0 :(得分:1)
这里的错误是因为View
协议内部有associatedtype Body
,因此您不能使用View
作为类型。这意味着我们必须提供有关tabView
的预期类型的更多信息。解决方案之一是使用AnyView
作为类型,但是这需要将其他内容包装到AnyView
中。
在这里我建议不要使用AnyView
,而是让编译器为您找出实际的tabView
类型。
Content
能够确认View
协议TabView
用作TabItem
声明的一部分的必要性。除非您有充分的理由不这样做,否则请尝试只使用View
。struct TabItem<Content: View>: View { // Content is a type that we expect. `View` is used instead of `TabView` as it is in original code
var tabView: Content // Using Content instead of a View as it is an actual type now
...
}
其余代码可以保持不变。