首页 > 解决方案 > 无法推断通用参数“父级”

问题描述

我正在处理我的第一个 Swift/SwiftUI 项目(教程除外)并且遇到了我认为是一个常见问题 - 错误Generic parameter 'Parent' could not be inferred- 当问题实际上与List我试图在表格中生成更低的位置。

我正在构建的应用程序是一个简单的发票应用程序:用户填写表单字段并发送发票。发票可以有多个行项目,用户一次输入一个,然后附加到显示在表单内的字典中。

这是结构顶部和视图开头的相关变量,我希望我在其中正确声明行项目的变量以根据用户输入修改它们。

*根据以下@asperi 的建议进行了编辑。

@State private var lineItems = [LineItem]()
@State private var lineItem = LineItem()

struct LineItem: Codable, Hashable {

    var productSku: String = ""
    var productName: String = ""
    var quantity: Double = 0
    var unitPrice: Double = 0
}

func addLineItem(lineItem: LineItem){
    lineItems.append(lineItem)
}
...   
var body: some View {
       NavigationView {
          Form {
            Section(header: Text("Customer Information")) { <-- error appears here
              TextField("Customer Name", text: $customerName)
              TextField("Customer Email", text: $customerEmail)
          }

这是表单的相关部分,我试图在其中列出所有当前行项目,然后允许用户插入其他行项目。在添加代码之前,我没有收到任何错误List,所以我很确定我在那里做错了什么。

Section(header: Text("Items")) {
    List(lineItems, id: \.self) { item in
        LineItemRow(lineItem: item)
        Text(item.productName)
    }
    TextField("Product SKU", text: $productSKU)
    TextField("Poduct Name", text: $productName)
    TextField("Unit Price", text: $unitPrice, formatter: DoubleFormatter())
    Picker("Quantity", selection: $quantity) {
        ForEach(0 ..< 10) {
            Text("\($0)")
        }
    }
    Button(action: {
        self.addLineItem(lineItem: LineItem(productSku:$productSKU,
                                            productName:$productName,
                                            quantity:$unitPrice,
                                            unitPrice:$quantity))
        print($lineItems)
    }, label: {
        Text("Add line item")
    })

}

我已经在控制台中测试了按钮功能,它似乎确实正确地附加到了字典中,但我也需要它来显示。

我可能对List. 有什么建议吗?

作为参考,这是整个视图:

struct AddInvoiceForm: View {
    @State private var invoiceNumber: String = ""
    @State private var _description: String = ""
    @State private var dueDate: Date = Date()
    @State private var sendImmediately: Bool = true

    @State private var currency = 0
    @State private var paymentType = 0

    @State private var customerName: String = ""
    @State private var customerEmail: String = ""

    @State private var productSKU: String = ""
    @State private var productName: String = ""
    @State private var quantity: Int = 0
    @State private var unitPrice: String = ""

    @State private var lineItems = [LineItem]()
    @State private var lineItem = LineItem()

    struct LineItem: Codable, Hashable {

        var productSku: String = ""
        var productName: String = ""
        var quantity: Double = 0
        var unitPrice: Double = 0
    }

    func addLineItem(lineItem: LineItem){
        lineItems.append(lineItem)
    }

    @State private var totalAmount: Double = 0.0

    static let currencies = ["USD","GBP"]

    var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Customer Information")) {
                    TextField("Customer Name", text: $customerName)
                    TextField("Customer Email", text: $customerEmail)
                }
                Section(header: Text("Invoice Information")) {
                    TextField("Invoice Number", text:$invoiceNumber)
                    TextField("Description", text:$_description)
                    DatePicker(selection: $dueDate, in: Date()..., displayedComponents: .date) {
                        Text("Due date")
                    }
                    Picker("Currency", selection: $currency) {
                       ForEach(0 ..< Self.currencies.count) {
                           Text(Self.currencies[$0])
                       }
                    }
                }
                Section(header: Text("Items")) {
                    List(lineItems, id: \.self) { item in
                        LineItemRow(lineItem: item)
                        Text(item.productName)
                    }
                    TextField("Product SKU", text: $productSKU)
                    TextField("Poduct Name", text: $productName)
                    TextField("Unit Price", text: $unitPrice, formatter: DoubleFormatter())
                    Picker("Quantity", selection: $quantity) {
                        ForEach(0 ..< 10) {
                            Text("\($0)")
                        }
                    }
                    Button(action: {
                        self.addLineItem(lineItem: LineItem(productSku:$productSKU,
                                                            productName:$productName,
                                                            quantity:$unitPrice,
                                                            unitPrice:$quantity))
                        print($lineItems)
                    }, label: {
                        Text("Add line item")
                    })

                }
                Section(header: Text("Totals")) {
                    Text("\(totalAmount)")
                }
                Section {
                    Button(action: {
                        print(Text("Send"))
                    }, label: {
                        Text("Send invoice")
                    })
                }
            }.navigationBarTitle("Invoice Details")
        }
    }
}

标签: swiftswiftuiswiftui-list

解决方案


List(lineItems, id: \.productSku) { item in <-- I get the error when I add this

您的项目是字典,但字典没有.productSku键路径,所以错误。

我认为最简单和正确的方法是制作Item为 struct

struct LineItem {
   var productSku: String
   ...
}

...

@State private var lineItems = [LineItem]()
@State private var lineItem = LineItem()

...

List(lineItems, id: \.productSku) { item in

推荐阅读