Swift - 将结构数组传递给另一个结构的初始化
Swift - passing array of struct to the init of another struct
如何初始化包含另一个结构数组的结构?
我想创建一个发票条目,其中的所有属性和项目都有一个 InvoiceItem 数组。
此外,当发票仍为草稿时,项目可以为空。
使用发票数据和项目从服务器读取 JSON 响应工作正常。
关于 viewcontroller 的保存操作,我有:
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]
}
}
您的发票初始化有 items: InvoiceItem
作为参数。项目的类型是 InvoiceItem
, 而不是 InvoiceItem
。
的数组
将类型更改为 InvoiceItem
的数组。
编辑:
在您的 Invoice init 中,您有:
self.items = [items]
您试图将 InvoiceItem
的数组传递给定义为 items: InvoiceItem
的参数。
那显然不行,所以我告诉你把参数类型改成InvoiceItem
的数组。
现在您已经完成了,您正在将 InvoiceItem
的数组包装在数组中。所以你有一个 InvoiceItem
.
数组的数组
将该行代码更改为:
self.items = items
让我们用明确的名称命名该方法,并添加一个,因为您正在混合数组和唯一对象。
我建议:
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])
.
调用第二个
如何初始化包含另一个结构数组的结构?
我想创建一个发票条目,其中的所有属性和项目都有一个 InvoiceItem 数组。
此外,当发票仍为草稿时,项目可以为空。
使用发票数据和项目从服务器读取 JSON 响应工作正常。
关于 viewcontroller 的保存操作,我有:
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]
}
}
您的发票初始化有 items: InvoiceItem
作为参数。项目的类型是 InvoiceItem
, 而不是 InvoiceItem
。
将类型更改为 InvoiceItem
的数组。
编辑:
在您的 Invoice init 中,您有:
self.items = [items]
您试图将 InvoiceItem
的数组传递给定义为 items: InvoiceItem
的参数。
那显然不行,所以我告诉你把参数类型改成InvoiceItem
的数组。
现在您已经完成了,您正在将 InvoiceItem
的数组包装在数组中。所以你有一个 InvoiceItem
.
将该行代码更改为:
self.items = items
让我们用明确的名称命名该方法,并添加一个,因为您正在混合数组和唯一对象。
我建议:
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])
.