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 调用调用函数的协议