[英]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.