当我试图从方法中返回符合View协议的不同自定义视图时,会出现编译错误。这里有一个简单的例子来描述这个问题。
我希望有一个基于枚举大小写返回不同自定义视图的方法。当我试图做到这一点时,我会得到不同的编译错误:
enum AppScreen: String, CaseIterable {
case home
case detail
}
struct ContentView: View {
var body: some View {
NavigationView {
List {
ForEach(AppScreen.allCases, id: \.self) { screen in
NavigationLink(destination: getSomeView(screen)) {
Text(screen.rawValue)
}
}
}
List {
ForEach(AppScreen.allCases, id: \.self) { screen in
NavigationLink(destination: getAnyView(screen)) {
Text(screen.rawValue)
}
}
}
}
}
private func getSomeView(_ screen: AppScreen) -> some View {
switch screen {
case .home:
return HomeView()
case .detail:
return DetailView()
}
}
private func getAnyView(_ screen: AppScreen) -> any View {
switch screen {
case .home:
return HomeView()
case .detail:
return DetailView()
}
}
}方法getSomeView引发以下编译错误:函数声明一个不透明的返回类型‘getSomeView’,但其正文中的返回语句没有匹配的底层类型
方法getAnyView编译,但是当我调用它作为NavigationLink的目标时,我会得到以下错误:输入‘getAnyView’不能符合'View‘
我正在学习SwiftUI和SWIFT5.7中的新的泛型特性。我相信我所寻找的行为是可以实现的。如有任何帮助或指导,将不胜感激!
发布于 2022-09-18 00:28:13
这就是如何实现你想要做的事情。
getSomeView()和@ViewBuilder。这使得它像var body一样工作,这也是一个ViewBuilder,允许您构建不同类型的视图。return语句.下面是一个基于原始代码的独立示例:
enum AppScreen: String, CaseIterable {
case home
case detail
}
struct HomeView: View {
var body: some View {
Text("HomeView")
}
}
struct DetailView: View {
var body: some View {
Text("DetailView")
}
}
struct ContentView: View {
var body: some View {
NavigationView {
List {
ForEach(AppScreen.allCases, id: \.self) { screen in
NavigationLink(destination: getSomeView(screen)) {
Text(screen.rawValue)
}
}
}
}
}
@ViewBuilder
private func getSomeView(_ screen: AppScreen) -> some View {
switch screen {
case .home:
HomeView()
case .detail:
DetailView()
}
}
}https://stackoverflow.com/questions/73758201
复制相似问题