簡體   English   中英

Swift-將結構體數組傳遞給另一個結構體的init

[英]Swift - passing array of struct to the init of another struct

我如何初始化一個包含另一個結構數組的結構?

我想創建一個具有所有屬性和具有InvoiceItem數組的項目的Invoice條目。

此外,當發票仍是草稿時,項目可以為空。

從服務器讀取帶有發票數據和項目的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)!
...
}

我收到此錯誤: 無法在行:items:invoiceItems上將類型'[InvoiceItem]'的值轉換為預期的參數類型'InvoiceItem'

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數組。

編輯:

在發票初始化中,您有:

self.items = [items]

您試圖將InvoiceItem數組InvoiceItem到定義為items: InvoiceItem的參數中items: InvoiceItem

那顯然是行不通的,所以我告訴您將參數類型更改為InvoiceItem數組。

現在,您已經將InvoiceItem數組包裝在array中。 因此,您有一個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])調用第二個方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM