当前位置: 首页 > 面试题库 >

Xcode Beta 6“在没有更多上下文的情况下,表达类型不明确” Navigationlink

夏谦
2023-03-14
问题内容

自从今天早些时候更新到Xcode Beta 6以来,我的应用程序将不再构建,它在Beta 5及更早版本中运行良好。

这是带有错误消息的文件中的代码,尽管我现在知道这并不一定意味着这实际上是错误所在。

import SwiftUI

struct JobView_Table : View {

    @ObservedObject var jobList: JobDetailViewModel = JobDetailViewModel()

    var body: some View {

        NavigationView {

            List {
                ForEach($jobList.jobDetails) { job in
                    NavigationLink(destination: JobDetailHost(jobDetails: job)) { // ERROR: "Type of expression is ambiguous without more context"
                        JobView_List(jobDetails: job)
                    }
                }
            }

            .navigationBarTitle(Text("My Jobs"))
            .onAppear(perform: fetchData)
            .onAppear(perform: {
                print("Hello!")
            })

        }
    }

    private func fetchData() {
        return(jobList.updateDetails())
    }
}

包含数据的结构正确符合以下协议。

struct JobDetails: Codable, Identifiable, Equatable, Hashable { 
    ...

    ...
}

这是向提供数据的类JobView_Table

import Foundation
import UIKit
import Combine

class JobDetailViewModel: ObservableObject, Identifiable {

    @Published var jobDetails: [JobDetails] = []

    func updateDetails() {
        self.jobDetails = DataManager().fetchJobList()
    }

}

最后是通过链接到的目标视图NavigationLink

struct JobDetailHost: View {

    @Environment(\.editMode) var mode
    @Binding var jobDetails: JobDetails


    var body: some View {

        VStack {
            JobDetailView(jobDetails: jobDetails)
        }
        .navigationBarItems(trailing: EditButton())
    }

}

我注意到其他一些人似乎也有类似的问题,例如下面列出的两个问题,但是目前这些问题的答案仍然无济于事。

编辑:

我试过实施Fabian的建议,这已消除了错误,但是列表中没有内容。

这是调整后的List代码,可以成功编译,但是在运行应用程序时不会填充列表。

List {
    ForEach(jobList.jobDetails.indexed(), id: \.1.id) { (index, job) in
            NavigationLink(destination: JobDetailHost(jobDetails: self.$jobList.jobDetails[index])) {
                        Text(job.jobName)
                    }
     }
}

以下代码不使用ForEach和丢弃NavigationLink,并且仍然无法正常工作。

List(jobList.jobDetails.indexed(), id: \.1.id) { (index, job) in
                Text(job.jobName)
            }

问题答案:

我将引用macOS Catalina 10.15 Beta
6发行说明

绑定结构对Collection协议的条件一致性已删除。(51624798)

如果您具有以下代码:

struct LandmarkList: View {
    @Binding var landmark: [Landmark]

    var body: some View {
        List(landmarks) { landmark in
            Toggle(landmark.value.name, isOn: landmark[\.isFavorite])
        }
    }
}

定义以下收集类型:

struct IndexedCollection<Base: RandomAccessCollection>:

RandomAccessCollection {
typealias Index = Base.Index
typealias Element = (index: Index, element: Base.Element)

    let base: Base

    var startIndex: Index { base.startIndex }

    var endIndex: Index { base.endIndex }

    func index(after i: Index) -> Index {
        base.index(after: i)
    }

    func index(before i: Index) -> Index {
        base.index(before: i)
    }

    func index(_ i: Index, offsetBy distance: Int) -> Index {
        base.index(i, offsetBy: distance)
    }

    subscript(position: Index) -> Element {
        (index: position, element: base[position])
    }
}

extension RandomAccessCollection {
    func indexed() -> IndexedCollection<Self> {
        IndexedCollection(base: self)
    }
}

然后,将代码更新为:

struct LandmarkList: View {
    @Binding var landmarks: [Landmark]

    var body: some View { // Does often give error on id: \.1.id
        List(landmarks.indexed(), id: \.1.id) { (index, landmark) in
            Toggle(landmark.name, isOn:

self.$landmarks[index].isFavorite)
}
}
}

您的代码也带有Binding<[JobDetails]>with
$jobList.jobDetails,但Binding<[JobDetails]>不再符合Collection协议。

但是请注意上面的解决方案,\.1.id由于编译器无法理解,我遇到了无法识别的情况,这\.1是指元组IndexedCollection定义中的第二个元素,但是我可能使用了错误的内容。可以重写它,但这使它起作用。

使用IndexedCollection的示例

struct AnotherIndexedView_NeedsEnv: View {
    @EnvironmentObject var modalManager: ModalManager

    var body: some View {
        ZStack {
            SwiftUI.ForEach(modalManager.modals.indexed()) { m in
                ModalView(currentModal: self.$modalManager.modals[m.index]).environmentObject(self.modalManager)
            }
        }.onAppear(perform: {self.modalManager.fetchContent()})
    }
}


 类似资料:
  • 问题内容: 我对Swift编码还很陌生,所以如果这个错误是简单的答案,请原谅! 我不断收到一条错误消息,指出“表达式类型在没有更多上下文的情况下是模棱两可的”。 有什么建议? 谢谢! 问题答案: 您可以帮助编译器了解如下信息:

  • 我试图从字典数组访问以下项目,我有两个问题(两者都是不同的方法)。字典数组初始化如下: 第一种方法: 无法运行,原因是(出现在for循环初始化行上): 第二种方法: 返回以下内容: 下面是我试图实现的伪代码等价物: 这几天我一直在琢磨这个问题,但我对swift及其习惯用法还不太了解,无法单独解决这个问题,任何帮助都将不胜感激(特别是如果我们能够找出如何使#1工作)。

  • 问题内容: 我试图将配置(例如URLs / etc)放入资源文件夹中,以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名(似乎使用assess /是为此用途设计的)来访问资源,而无需使用上下文来访问资源。 在这种特殊情况下,我希望单例实例化时在配置中使用某些东西。除了实例化期间的那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递Con

  • 问题内容: 我有一个Flask应用程序,当从flask调用它时,调用时不会出现问题。 我需要相同的方法在flask外部工作 我可以使用,但是我想在两种情况下(flask and command line)都可以使用相同的方法 问题答案: 你需要在应用程序上下文中呈现它。将应用程序导入后端代码,然后执行以下操作。

  • 我不想再使用powermock了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。 当我使用PowerMock时,我可以很容易地发现一个具有私有构造函数的类,然后我调用静态方法。 这是我代码的一部分(当我使用PowerMock时) 在我做了MessageValidationUtils.class的间谍对象后,我正在测试这个: 经过一些研究,我找不到任何与监视一个具有私有构造

  • 我正在尝试将Cucumber集成到现有的Spring Boot项目中 当前项目是单个Maven模块 单元测试(不含Spring上下文)和集成测试(含Spring上下文)组合在同一个测试文件夹中。 我想做的是能够调整我的单元测试和集成测试。 但是一旦我添加了依赖项(为了能够在规范旁边运行Spring上下文),它就要求文件夹中的所有测试都用注释。 下面是我的测试套件,配置为获取测试规范。 是否可以将两