SwiftUI:列表视图与 ForEach 视图

SwiftUI: List view vs ForEach view

下面的代码主要确定它是否应该显示按小时计薪的工作或其他工作的列表,然后 returns 一个基于此的视图。我遇到的问题是,如果我用 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

抱歉问题太长了!

Type of expression is ambiguous without more context

SwiftUI 因发出这样无用的错误而臭名昭著。通常最好的调试方法是注释掉/删除代码行,直到它给你一个更有帮助的信息。但无论如何,您收到此错误的原因是因为这些行:

ForEach(hourlyJobs) { job in
ForEach(careerJobs) { job in
ForEach(otherJobs) { job in

根据 documentation:

Either the collection’s elements must conform to Identifiable or you need to provide an id parameter to the ForEach initializer.

嗯,您没有在以上 3 行中的任何一行中传递 id 参数。这意味着 hourlyJobs/careerJobs/otherJobs 数组中的每个元素都必须符合 Identifiable - 因为它们不符合,所以会出现错误。

所以你有两个选择:

  1. 传入id参数

SwiftUI 随后将使用每个元素的哈希值作为其标识符(更多详细信息 here)。然而,这并不理想,并且可能会导致一些奇怪的故障(尤其是动画)。

ForEach(hourlyJobs, id: \.self) {
ForEach(careerJobs, id: \.self) {
ForEach(otherJobs, id: \.self) {
  1. 使您的 Job 结构符合 Identifiable

简单易用!只要做:

struct Job: Identifiable {
    let id = UUID()
    var jobTitle: String
}

这满足文档的“集合的元素必须符合可识别”部分,因此您的原始代码可以正常编译。