SwiftUI:列表视图与 ForEach 视图
Posted
技术标签:
【中文标题】SwiftUI:列表视图与 ForEach 视图【英文标题】:SwiftUI: List view vs ForEach view 【发布时间】:2021-10-28 06:08:20 【问题描述】:以下代码实质上确定它是否应该显示按小时付费的工作或其他工作的列表,然后基于此返回一个视图。我遇到的问题是,如果我用 ForEach 视图替换 List 视图,我会收到错误消息:Type of expression is ambiguous without more context
。
根据我的研究,这似乎是与类型有关的错误。然而,这就是为什么我把它打包成一个组。那么,为什么列表视图不会产生错误,而 ForEach 视图会产生错误呢?
func jobList(_ jobListMode: String) -> some View
Group
switch jobListMode
case "Hourly":
List(hourlyJobs, id: \.id) job in
Text(job.jobTitle)
default:
List(hourlyJobs, id: \.id) job in
Text(job.jobTitle)
这不会产生错误^^^
func jobList(_ jobListMode: String) -> some View
Group
switch jobListMode
case "Hourly":
ForEach(hourlyJobs) job in
Text(job.jobTitle)
default:
ForEach(hourlyJobs) job in
Text(job.jobTitle)
这会产生错误:Type of expression is ambiguous without more context
抱歉这个问题太长了!
【问题讨论】:
试试ForEach(hourlyJobs, id: \.self)
(ForEach也需要每个元素都符合Identifiable
)
您也可以显示hourlyJobs
和Job
的代码吗?
@aheze 成功了,非常感谢!
不!我还添加了一个包含更多详细信息的答案。
【参考方案1】:
没有更多上下文的表达类型是模棱两可的
SwiftUI 因发出此类无益的错误而臭名昭著。通常最好的调试方法是注释掉/删除代码行,直到它给你一个更有用的信息。但无论如何,您收到此错误的原因是因为以下几行:
ForEach(hourlyJobs) job in
ForEach(careerJobs) job in
ForEach(otherJobs) job in
根据documentation:
集合的元素必须符合 Identifiable 或您需要为 ForEach 初始化程序提供一个 id 参数。
好吧,您没有在上述 3 行中的任何一行中传入 id
参数。这意味着您的 hourlyJobs
/careerJobs
/otherJobs
数组中的每个元素都必须符合 Identifiable
- 因为它们不符合,所以您会收到错误。
所以你有两个选择:
-
传入
id
参数
SwiftUI 然后将使用每个元素的哈希值作为其标识符(更多详细信息here)。但是,这并不理想,并且可能会导致一些奇怪的故障(尤其是动画)。
ForEach(hourlyJobs, id: \.self)
ForEach(careerJobs, id: \.self)
ForEach(otherJobs, id: \.self)
-
将您的
Job
结构与Identifiable
一致
它很简单,效果很好!做吧:
struct Job: Identifiable
let id = UUID()
var jobTitle: String
这满足了文档的“集合的元素必须符合 Identifiable”部分,因此您的原始代码可以正常编译。
【讨论】:
以上是关于SwiftUI:列表视图与 ForEach 视图的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI,@Published 和 ForEach 没有更新我的视图