从 swift 中的 api 访问嵌套字典

accessing nested dictionary from api in swift

天哪...必须 是在

中访问 formatted 的更好方法
floorplan_summary: {
    bedrooms: {
        low: 1,
        high: 2,
        formatted: "1 - 2 Beds"
    }
}

比这样做:

    if data["floorplan_summary"]?["bedrooms"] != nil {
        let bedrooms = data["floorplan_summary"]?["bedrooms"] as NSDictionary
        if bedrooms["formatted"] != nil{
            self.beds = bedrooms["formatted"] as String
        }
    }

我只想这样做:

self.beds = data["floorplan_summary"]?["bedrooms"]?["formatted"] as String

..但在每个级别,对象似乎都被转换为 AnyObject。为什么编译器可以假设这个 data["floorplan_summary"]?["bedrooms"] 而不是上面的?

我怎样才能简化这个?

如果您需要您描述的语法,我建议您使用 SwiftyJSON。它看起来很流行,并且全部在单个 swift 文件中实现,因此不难将其添加到您的项目中。它看起来像这样。

let floorPlanSummary = JSON(data: yourRawData)
self.beds = floorPlanSummery["bedrooms"]["formatted"].string

您也许可以调用 data.valueForKeyPath("floorplan_summary.bedrooms.formatted")

假设 dataNSDictionary[String:AnyObject]。您可以:

let beds = data["floorplan_summary"]?["bedrooms"]??["formatted"] as? String // -> as String?
                                                  ^

您需要额外的 ? 因为 data["floorplan_summary"]?["bedrooms"] returns AnyObject??。你必须解开它两次

为什么 returns AnyObject???因为data["floorplan_summary"]?AnyObject,而AnyObject不一定subscript。所以,第一个 ? 表示 "If it has subscript",第二个表示 "If subscript returns non nil".