簡體   English   中英

字典數組中的Swift字典

[英]Swift Dictionaries in Arrays in Dictionary

我試圖了解為什么dico [“ tickets”]不是[Any]類型的:

import Foundation

var array: [Any]!

let dico: [String: Any] = ["tickets": [["itemLines": [["name": "kebab", "units": 1], ["name": "muffin", "units": 1], ["name": "coca-cola", "units": 2]]]], "totale": 225.00]


if let tickets = dico["tickets"] as? [Any] {
    array = tickets
}

println(array)

(Xcode 6 GM)

有什么線索嗎?

除非絕對必要,否則不要使用Any 在這種情況下,對此進行推理非常棘手。 Swift具有類型參數化(泛型)是有原因的。 在大多數情況下,無論如何您都想要一個結構。

我試圖寫出這種東西的實際類型,但是用Swift編寫實際上是不可能的。 第二個元素是[String:Float] ,這很好。 但是第一個元素是[String:[[String: Any]]] ,這是Swift不會隱式提升為的類型(並且恰好是一個非常瘋狂的類型)。 如果您明確要求將Swift確切地升至Any則Swift只會升為Any 這就是為什么它不會在這里悄悄提升為[Any] 這是一個功能。 如果不是這樣,那么各種各樣的事情都會悄悄地升級為Any ,並且編譯器錯誤將更加令人困惑。

答案是避免Any 您真正擁有的是以下兩個結構:

struct Item {
  let name: String
  let units: Int
}

struct Dico {
  let tickets: [Item]
  let totale: Float
}

let dico = Dico(tickets: [
  Item(name: "kebab", units: 1),
  Item(name: "muffin", units: 1),
  Item(name: "coca-cola", units: 2)
  ],
  totale: 225.00 )

let tickets = dico.tickets

這就是應該存儲和處理數據的方式。 如果您以類似JSON的形式返回了很多Any對象,則應在使用它之前將其解析為數據結構。 否則,您將在整個代碼中使用這個瘋狂的字典。 我一直在寫Swift的JSON解析文章,該文章以Functional Wish Fulfillment開始。 我在那里鏈接到其他幾種類似的方法。 相同的基本技術適用於所有解析器,而不僅僅是JSON。

暫無
暫無

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

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