[Item]
内の@EnvironmentObject
リストを参照しようとしていますが、SwiftUI
List
内のリストにアクセスすると、エラーが発生します。 Appleのランドマークチュートリアル に従っても、このエラーはポップアップしません。
私が知る限り、[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
}
]
回答で述べたように、ForEach
にはIdentifiable
オブジェクトのリストが必要です。ただし、オブジェクトにそのプロトコルを実装させたくない場合(または何らかの理由でプロトコルを実装できない場合)は、次のトリックがあります。
item.identifiedBy(\.self)
どうやら、モデル(この場合はItem
)がIdentifiable
プロトコルに準拠しているかどうかを確認できなかったようです。それでも、私はAppleがエラーメッセージでより明確になったことを望みます。
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
}
私は同じ問題を抱えていましたが、それは行自体に関連するものではなく、中括弧/大括弧に関連していたため、誰かが同じ問題に直面し、問題がどこにあるのかわからない場合は、中をトレースしてみてくださいブレースとブラケット