斯威夫特字典
问题描述:
我试图理解为什么迪科[ “入场券”]是[任何]类型不是:斯威夫特字典
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
,编译器错误会更加混乱。
答案是为了避免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。
我几乎明白了!我在这里尝试的是在使用静态数据在网络/ JSON部分工作之前构建我的视图。谢谢,我会看看你的关于JSON解析的链接。 – Alak 2014-09-12 15:25:35