Generi c параметр 'Parent' не может быть выведен - PullRequest
1 голос
/ 29 февраля 2020

Я работаю над своим первым проектом 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")
    })

}

Я проверил функциональность кнопок в консоли и кажется, что он правильно добавляется в словарь, но мне нужно, чтобы он отображался также.

Возможно, я что-то неправильно понял c с 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")
        }
    }
}

1 Ответ

2 голосов
/ 29 февраля 2020
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
...