type() 不能符合 View;只有结构/枚举/类类型可以符合协议

Posted

技术标签:

【中文标题】type() 不能符合 View;只有结构/枚举/类类型可以符合协议【英文标题】:Type () cannot conform to View; only struct/enum/class types can conform to protocols 【发布时间】:2021-05-07 18:46:32 【问题描述】:

我正在关注本教程https://www.youtube.com/watch?v=Xd0J18isFEQ 我的应用程序,这是一个简单的应用程序,它在主屏幕上显示值列表 + 然后每行都有一个详细视图

我已经实现了一个路由器来为我的应用指定路由,如下所示:

enum Router 
    case detail(Result)


struct Navigator 
    static func navigate<T: View>(_ route: Router, content: () -> T) -> AnyView 
        switch route 
        
        case .detail(let item):
            return AnyView(NavigationLink(
                            destination: DetailView(story: item)) 
                            content()
                
            )
        
    

我在我的主屏幕上使用它嵌入如下:

struct Home: View 
    @ObservedObject var newsfeed = Newsfeed()
    @State var page: Int = 1

    var body: some View 
        List 
            ForEach(newsfeed.data)  item in
                
                Navigator.navigate(.detail(item)) 
                    HStack 
                        WebImage(url: URL(string: item.fields.thumbnail)!)
                            .resizable()
                            .scaledToFill()
                            .frame(width: 120, height: 120)
                            .cornerRadius(2)
                    
                    VStack (alignment: .leading, spacing: 5) 
                        Text(item.fields.headline)
                            .font(.headline)
                            .fontWeight(.bold)
                        Text(item.fields.trailText)
                            .font(.caption)
                    
                    .frame(maxHeight: 120)
                
                .onAppear() 
                    if (newsfeed.data.last == item) 
                        newsfeed.loadData(pageParam: page + 1, search: nil, key: nil)  result, size in
                            if (result != nil)  newsfeed.data.append(contentsOf: result!) 
                            if (size != nil)  newsfeed.pageSize += size! 
                        
                        self.page += 1
                    
                
            
        
    

但我在 Navigator.navigat 上遇到错误。类型 '()' 不能符合 View,只有 struct/enum/class 类型可以符合协议

【问题讨论】:

【参考方案1】:

navigate,正如所写,想要接受 一个 参数,但您同时发送了一个 HStack 和一个 VStack

@ViewBuilder 可以为你解决这个问题,它是一个注解(在 SwiftUI 中经常使用,尤其是在内置组件中),它可以让视图拥有/返回多个根级元素:

static func navigate<T: View>(_ route: Router, @ViewBuilder content: () -> T) -> AnyView 

【讨论】:

如果你在参数上使用它,为什么不在返回类型上? @Jessy 我不确定将它添加到返回类型会完成什么——你能详细说明一下吗?您可以将它添加到函数本身——也许这就是您要寻找的。有关示例,请参阅swiftwithmajid.com/2019/12/18/…

以上是关于type() 不能符合 View;只有结构/枚举/类类型可以符合协议的主要内容,如果未能解决你的问题,请参考以下文章

使用 if 语句时:类型 '()' 不能符合 'View';只有结构/枚举/类类型可以符合协议

“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”

类型“Favorites.Type”不能符合“Encodable”;只有结构/枚举/类类型可以符合协议

协议类型“Encodable”的值不能符合“Encodable”;只有结构/枚举/类类型可以符合协议

按钮操作块内的 Foreach 循环抛出“Type() 不能符合视图”

类型 '()' 不能符合 'View';只有 struct/enum/class 类型可以符合使用 swift ui 调用调用函数的协议