首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI和SWIFT5.7:视图协议和不透明类型的问题

SwiftUI和SWIFT5.7:视图协议和不透明类型的问题
EN

Stack Overflow用户
提问于 2022-09-17 20:10:53
回答 1查看 114关注 0票数 -1

当我试图从方法中返回符合View协议的不同自定义视图时,会出现编译错误。这里有一个简单的例子来描述这个问题。

我希望有一个基于枚举大小写返回不同自定义视图的方法。当我试图做到这一点时,我会得到不同的编译错误:

代码语言:javascript
复制
    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中的新的泛型特性。我相信我所寻找的行为是可以实现的。如有任何帮助或指导,将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-18 00:28:13

这就是如何实现你想要做的事情。

  1. 马克getSomeView()@ViewBuilder。这使得它像var body一样工作,这也是一个ViewBuilder,允许您构建不同类型的视图。
  2. 删除return语句.

下面是一个基于原始代码的独立示例:

代码语言:javascript
复制
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()
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73758201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档