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