SwiftUI创建字典以容纳不同的视图

SwiftUI创建字典以容纳不同的视图,swift,generics,swiftui,Swift,Generics,Swiftui,我正在尝试构建一个非常简单的SwiftUI程序来轻松交换视图。我们的目标是尽可能简单地添加更多视图,而不必更改确定哪个视图是如何显示的代码(因此标准的if-else不起作用) 我目前的想法是保留一个字典,其中的视图存储为键值对的一部分。实施的一个非常基本的示例如下: import SwiftUI struct ViewA: View { var body: some View { Text("This is View A") } } struct View

我正在尝试构建一个非常简单的SwiftUI程序来轻松交换视图。我们的目标是尽可能简单地添加更多视图,而不必更改确定哪个视图是如何显示的代码(因此标准的
if-else
不起作用)

我目前的想法是保留一个字典,其中的视图存储为键值对的一部分。实施的一个非常基本的示例如下:

import SwiftUI

struct ViewA: View {
  var body: some View {
    Text("This is View A")
  }
}

struct ViewB: View {
  var body: some View {
    Text("This is View B")
  }
}

struct MainView: View {
  
  var subviews: [String:View] = [
    "View-1": ViewA(),
    "View-2": ViewB(),
  ]
  
  var body: some View {
    self.subviews["View-1"]
  }
}
但是,我在创建字典的行中遇到一个错误:
协议“视图”只能用作一般约束,因为它具有自身或关联的类型要求

我为字典的值部分尝试了许多不同的类型,包括
AnyView
,以及在MainView结构上创建泛型类型
。然而,这些会产生更多/不同的错误

我看过这个项目,因为它解决了我想要实现的目标,但是我的目标有点过于简单


提前感谢。

Swift没有命名的下标,因此您必须将其简陋地组合在一起,但您可以使用相同的调用语法和其他有用/更好的语言功能:

struct MainView:View{
var body:一些观点{
子视图[“视图-1”]
}
枚举子视图{
@ViewBuilder静态下标(string:string)->一些视图{
开关串{
案例“视图-1”:
ViewA()
案例“视图2”:
ViewB()
违约:
法塔莱罗()
}
}
}
}

Swift没有命名的下标,因此您必须将其简陋地组合在一起,但您可以使用相同的调用语法和其他有用/更好的语言功能:

struct MainView:View{
var body:一些观点{
子视图[“视图-1”]
}
枚举子视图{
@ViewBuilder静态下标(string:string)->一些视图{
开关串{
案例“视图-1”:
ViewA()
案例“视图2”:
ViewB()
违约:
法塔莱罗()
}
}
}
}

AnyView
应该可以工作,但是您需要在
AnyView(ViewA())
中包装任何视图来存储它。谢谢!唯一的问题是我读到AnyView效率不高。您认为这会显著影响性能吗?我的理解是,如果所有视图都是
AnyView
类型(而不是通过不透明的
some View
实现的确切类型),SwiftUI将不知道不需要重新计算哪个视图树分支。但是,如果您需要一个类似路由器的功能,其中需要使用完全不同的视图层次结构,我认为不可避免的是,您需要使用
AnyView
AnyView
应该可以工作,但您需要将任何视图包装在
AnyView(ViewA())
中来存储它。谢谢!唯一的问题是我读到AnyView效率不高。您认为这会显著影响性能吗?我的理解是,如果所有视图都是
AnyView
类型(而不是通过不透明的
some View
实现的确切类型),SwiftUI将不知道不需要重新计算哪个视图树分支。但是,如果你需要一个类似路由器的功能,需要使用完全不同的视图层次结构,我认为你不可避免地需要使用
AnyView
Thank@Jessy,但我并不同意你的观点。您将要在Swift中制作一本字典,其中键是字符串或任何其他类型的内容。您只需像我上面所做的那样使用字典语法。对不起,我不明白你的措辞。你好像认为我不知道字典的类型是什么。谢谢@Jessy,但我不太同意你的看法。您将要在Swift中制作一本字典,其中键是字符串或任何其他类型的内容。您只需像我上面所做的那样使用字典语法。对不起,我不明白你的措辞。你好像认为我不知道字典的类型是什么。