在swift中从api访问嵌套字典

d2b*_*rke 2 optional swift

天哪......还有必须有更好的方式来访问formatted

floorplan_summary: {
    bedrooms: {
        low: 1,
        high: 2,
        formatted: "1 - 2 Beds"
    }
}
Run Code Online (Sandbox Code Playgroud)

比这样做:

    if data["floorplan_summary"]?["bedrooms"] != nil {
        let bedrooms = data["floorplan_summary"]?["bedrooms"] as NSDictionary
        if bedrooms["formatted"] != nil{
            self.beds = bedrooms["formatted"] as String
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想这样做:

self.beds = data["floorplan_summary"]?["bedrooms"]?["formatted"] as String
Run Code Online (Sandbox Code Playgroud)

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

我该如何简化这个?

rin*_*aro 7

假设dataNSDictionary,或[String:AnyObject].您可以:

let beds = data["floorplan_summary"]?["bedrooms"]??["formatted"] as? String // -> as String?
                                                  ^
Run Code Online (Sandbox Code Playgroud)

你需要额外的,?因为data["floorplan_summary"]?["bedrooms"]回报AnyObject??.你必须打开两次.

为什么会回来AnyObject???由于data["floorplan_summary"]?AnyObject,和AnyObject 可能会或可能不会subscript.所以,第一个?意思是"如果它有subscript",第二个意思是"如果subscript返回非nil".