web-dev-qa-db-ja.com

Xcode 11のコンテキストがなければ、式のタイプがあいまいです

[Item]内の@EnvironmentObjectリストを参照しようとしていますが、SwiftUIList内のリストにアクセスすると、エラーが発生します。 Appleのランドマークチュートリアル に従っても、このエラーはポップアップしません。

私が知る限り、[Item]リストは、印刷して他の機能を実行できるため、正しく読み込まれています。それをSwiftUIListに使用すると、バグが発生します。見逃したことはありますか?

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
    }
]
9
Lorenzo Ang

回答で述べたように、ForEachにはIdentifiableオブジェクトのリストが必要です。ただし、オブジェクトにそのプロトコルを実装させたくない場合(または何らかの理由でプロトコルを実装できない場合)は、次のトリックがあります。

item.identifiedBy(\.self)

4
piebie

どうやら、モデル(この場合はItem)がIdentifiableプロトコルに準拠しているかどうかを確認できなかったようです。それでも、私はAppleがエラーメッセージでより明確になったことを望みます。

4
Lorenzo Ang

Identifiableに準拠するには、idまたはuid変数に一意の値を指定するだけです。

これを行う簡単な方法は次のとおりです。

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
}
0
Akash Kundu

私は同じ問題を抱えていましたが、それは行自体に関連するものではなく、中括弧/大括弧に関連していたため、誰かが同じ問題に直面し、問題がどこにあるのかわからない場合は、中をトレースしてみてくださいブレースとブラケット

0