【问题标题】:Swift - passing array of struct to the init of another structSwift - 将结构数组传递给另一个结构的初始化
【发布时间】:2018-02-28 16:30:27
【问题描述】:

如何初始化包含另一个结构的数组的结构?

我想创建一个包含所有属性和项目的 Invoice 条目,其中包含 InvoiceItem 数组。

此外,当发票仍为草稿时,项目可以为空。

从服务器读取带有发票数据和项目的 JSON 响应可以正常工作。

关于视图控制器的保存操作我有:

var invoice: Invoice?
var client: Client?
var invoiceItems : [InvoiceItem] = [InvoiceItem]()

@IBAction func saveInvoice(_ sender: Any) {

...

invoice = Invoice(invoice_id: invoice?.invoice_id, client_id: client_id, tax: 0.00, date_issue: dateIssue, due_date: dueDate,
amount_paid: 0.00,
date_transaction: "0000-00-00",
voided: 0,
note: "",
invoice_number: "",
status: "",
items: invoiceItems
)

override func viewDidLoad() {

...
 invoiceItems = (invoice?.items)!
...
}

我收到此错误:无法将类型“[InvoiceItem]”的值转换为预期的参数类型“InvoiceItem”,在线:项目:invoiceItems

struct InvoiceItem: Codable {
    var invoice_detail_id: Int!
    let description: String!
    let unit_price: Decimal!
    let quantity: Decimal!

    init(invoice_detail_id: Int! = nil, description: String, unit_price: Decimal, quantity: Decimal) {
        self.invoice_detail_id = invoice_detail_id
        self.description = description
        self.unit_price = unit_price
        self.quantity = quantity
    }
}

struct Invoice: Codable {
    var invoice_id: Int!
    let client_id: Int!
    let tax: Decimal!
    let date_issue: String!
    let due_date: String!
    let amount_paid: Decimal!
    let date_transaction: String!
    let voided: Int!
    let note: String!
    let invoice_number: String!
    let status: String!
    let items: [InvoiceItem]!

    init(invoice_id: Int! = nil, client_id: Int! = nil,tax: Decimal, date_issue: String, due_date: String, amount_paid: Decimal, date_transaction: String, voided: Int, note: String, invoice_number: String, status: String, items: InvoiceItem) {
        self.invoice_id = invoice_id
        self.client_id = client_id
        self.tax = tax
        self.date_issue = date_issue
        self.due_date = due_date
        self.amount_paid = amount_paid
        self.date_transaction = date_transaction
        self.voided = voided
        self.note = note
        self.invoice_number = invoice_number
        self.status = status
        self.items = [items]
    }


}

【问题讨论】:

  • 不相关但从不、从不、从不将属性声明为在 init 方法中初始化的类/结构中的隐式未包装可选。如果使用非可选值初始化属性,则将其声明为非可选(no 感叹号),否则为常规可选(?)。
  • 在 Swift 中新增。我试过 w ?但是整个代码都出错了
  • 什么错误?删除除invoice_idclient_idinvoice_detail_id 之外的所有感叹号。对于这 3 个属性,将 ! 更改为 ?

标签: arrays swift struct init


【解决方案1】:

您的发票初始化有 items: InvoiceItem 作为参数。项目的类型是InvoiceItem不是InvoiceItem 的数组。

将类型更改为InvoiceItem的数组。

编辑:

在您的 Invoice 中,您有:

self.items = [items]

您试图将InvoiceItem 的数组传递给定义为items: InvoiceItem 的参数。

这显然行不通,所以我告诉你将参数类型更改为InvoiceItem的数组。

现在你已经有了,你正在将你的 InvoiceItem 数组包装在数组中。所以你有一个由InvoiceItem 组成的数组。

将该行代码更改为:

self.items = items

【讨论】:

  • 我试过了,但仍然出错:init... items: [InvoiceItem]) { ... self.items = items OR self.items = [items] xcode 有延迟。现在看起来不错。
  • @RenanAguiar 查看编辑,由于我告诉你要做的第一个更改,出现了另一个问题。
【解决方案2】:

让我们用明确的名称命名方法,然后添加一个,因为您正在混合数组和唯一对象。

我建议:

init(invoice_id: ... status: String, anItem: InvoiceItem)
{
   ...
   self.items = [anItem]
}

init(invoice_id: ... status: String, multipleItems: [InvoiceItem])
{
   ...
   self.items = multipleItems
}

在您的代码中,因为它是var invoiceItems : [InvoiceItem] = [InvoiceItem](),所以我会使用第二个,因为它是InvoiceItem 的数组。

invoice = Invoice(invoice_id: invoice?.invoice_id,
                  client_id: client_id,
                  tax: 0.00,
                  date_issue: dateIssue,
                  due_date: dueDate,
                  amount_paid: 0.00,
                  date_transaction: "0000-00-00",
                  voided: 0,
                  note: "",
                  invoice_number: "",
                  status: "",
                  multipleItems: invoiceItems
                  )

我不知道你是否还想使用第一个,但以防万一你可以使用 keep。请避免这两种方法之间仍然存在重复代码,第一种方法可以使用init(... multipleItems:[anItem]) 调用第二种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多