Arrays 字典中数组中的Swift字典

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

我试图理解为什么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 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解析的链接。