繁体   English   中英

字典数组中的Swift字典

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM