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 您也可以显示hourlyJobsJob 的代码吗? @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 没有更新我的视图

Codeigniter foreach 视图表布局

SwiftUI 列表未使用 ForEach 正确更新

列表元素上的 SwiftUI 清除背景

SwiftUI List 和 For Each 循环与空白元素

删除最后一个数组元素时,SwiftUI列表ForEach索引超出范围