斯威夫特字典

问题描述:

我试图理解为什么迪科[ “入场券”]是[任何]类型不是:斯威夫特字典

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。

+0

我几乎明白了!我在这里尝试的是在使用静态数据在网络/ JSON部分工作之前构建我的视图。谢谢,我会看看你的关于JSON解析的链接。 – Alak 2014-09-12 15:25:35