【问题标题】:Type of expression is ambiguous without more context in Xcode 11Xcode 11 中没有更多上下文的表达式类型不明确
【发布时间】:2019-11-03 03:26:44
【问题描述】:

我试图在@EnvironmentObject 中引用[Item] 列表,但是在SwiftUI List 中访问它时,我得到了错误。我不明白的是,关注Apple's Landmark tutorial 时不会弹出此错误。

据我所知,[Item] 列表正在正确加载,因为我可以将其打印出来并使用它执行其他功能。它只是在将它用于SwiftUI List 时出错了我错过了什么吗?

ItemHome.swift:

struct ItemHome : View {

    @EnvironmentObject var dataBank: DataBank

    var body: some View {
        List {
            ForEach(dataBank.itemList) { item in
                Text("\(item.name)") // Type of expression is ambiguous without more context
            }
        }
    }
}

支持代码如下:

项目结构:

struct Item {

    var id: Int
    var uid: String
    var company: String
    var item_class: String
    var name: String
    var stock: Int
    var average_cost: Decimal
    var otc_price: Decimal
    var dealer_price: Decimal
    var ctc_price: Decimal
}

DataBank.swift:

final class DataBank : BindableObject {
    let didChange = PassthroughSubject<DataBank, Never>()

    var itemList: [Item] = load("itemsResults.json") {
        didSet {
            didChange.send(self)
        }
    }
}

func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T {
let data: Data

guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
    else {
        fatalError("Couldn't find \(filename) in main bundle.")
}

do {
    data = try Data(contentsOf: file)
} catch {
    fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}

do {
    let decoder = JSONDecoder()
    return try decoder.decode(T.self, from: data)
} catch {
    fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}

}

itemsResults.json:

[
    {
        "id": 1,
        "uid": "a019bf6c-44a2-11e9-9121-4ccc6afe39a1",
        "company": "Bioseed",
        "item_class": "Seeds",
        "name": "9909",
        "stock": 0,
        "average_cost": 0.0,
        "otc_price": 0.0,
        "dealer_price": 0.0,
        "ctc_price": 0.0
    },
    {
        "id": 2,
        "uid": "a019bf71-44a2-11e9-9121-4ccc6afe39a1",
        "company": "Pioneer",
        "item_class": "Seeds",
        "name": "4124YR",
        "stock": 0,
        "average_cost": 0.0,
        "otc_price": 0.0,
        "dealer_price": 0.0,
        "ctc_price": 0.0
    }
]

【问题讨论】:

    标签: swift xcode swiftui


    【解决方案1】:

    显然我错过了确保我的模型(在这种情况下为Item)符合修复它的Identifiable 协议。不过,我希望 Apple 更清楚他们的错误消息。

    【讨论】:

      【解决方案2】:

      正如您在回答中提到的,ForEach 需要一个 Identifiable 对象列表。但是,如果您不想让您的对象实现该协议(或由于某种原因不能实现),那么这里有一个技巧:

      item.identifiedBy(\.self)

      【讨论】:

      • 感谢小费馅饼!它适用于Item,因为它已经拥有var id: Int,这会自动使其符合Identifiable。我会记住它,以防我将来需要它!
      【解决方案3】:

      我遇到了同样的问题,它与线本身无关,它与花括号/方括号有关,所以如果有人遇到同样的问题并且不知道问题出在哪里,请尝试跟踪花括号和方括号

      【讨论】:

        【解决方案4】:

        要符合Identifiable,只需给iduid 变量一个唯一值。

        一个简单的方法是:

        var uid = UUID()

        所以你的完整结构是:

        struct Item: Identifiable {
        
            var id: Int
            var uid = UUID()
            var company: String
            var item_class: String
            var name: String
            var stock: Int
            var average_cost: Decimal
            var otc_price: Decimal
            var dealer_price: Decimal
            var ctc_price: Decimal
        }
        

        【讨论】:

          猜你喜欢
          • 2020-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-23
          • 2021-05-17
          • 2019-04-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多