Arrays 字典中数组中的Swift字典
我试图理解为什么dico[“票”]不是[任何]类型:Arrays 字典中数组中的Swift字典,arrays,dictionary,casting,swift,Arrays,Dictionary,Casting,Swift,我试图理解为什么dico[“票”]不是[任何]类型: 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 tic
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
。这就是为什么它不会在这里悄悄地升级到[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之类的东西开始,它会返回一堆
任何
对象,那么您应该在使用它之前将其解析为数据结构。否则你会在整个代码中与这本疯狂的字典斗争。我一直在写一系列关于Swift中的JSON解析的文章,这一系列文章始于。我将其与其他几种类似的方法联系起来。同样的基本技术适用于任何解析器,而不仅仅是JSON。我几乎明白了!我在这里尝试的是在处理network/JSON部分之前使用静态数据构建视图。谢谢,我来看看你关于JSON解析的链接。