【问题标题】:Swift Dictionaries in Arrays in Dictionary字典中的数组中的 Swift 字典
【发布时间】:2014-09-12 14:48:18
【问题描述】:

我试图理解为什么 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 通用)

有什么线索吗?

【问题讨论】:

    标签: arrays dictionary casting swift


    【解决方案1】:

    除非万不得已,否则不要使用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
    

    这就是您应该存储和处理数据的方式。如果您从返回一堆 Any 对象的 JSON 之类的东西开始,您应该在使用它之前将其解析为数据结构。否则,您将在整个代码中与这本疯狂的字典作斗争。在以Functional Wish Fulfillment 开头的系列文章中,我一直在写关于 Swift 中 JSON 解析的文章。我在那里链接到其他几个类似的方法。相同的基本技术适用于任何解析器,而不仅仅是 JSON。

    【讨论】:

    • 我几乎明白了!我在这里尝试的是在处理网络/JSON 部分之前使用静态数据来构建我的视图。谢谢,我会看看你关于 JSON 解析的链接。
    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 2018-01-05
    • 2015-05-10
    • 2014-12-10
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多