从 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")
假设 data
是 NSDictionary
或 [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
".
天哪...必须 是在
中访问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")
假设 data
是 NSDictionary
或 [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
".