ValueForKeyPath() 返回意外的东西

Posted

技术标签:

【中文标题】ValueForKeyPath() 返回意外的东西【英文标题】:ValueForKeyPath() returning something unexpected 【发布时间】:2014-08-07 12:50:56 【问题描述】:

我正在解析这个 json:


"destination_addresses" : [ "Göteborg, Sverige" ],
"origin_addresses" : [ "Stockholm, Sverige" ],
"rows" : [
   
      "elements" : [
         
            "distance" : 
               "text" : "467 km",
               "value" : 466568
            ,
            "duration" : 
               "text" : "4 timmar 34 min",
               "value" : 16468
            ,
            "status" : "OK"
         
      ]
   
],
"status" : "OK"

像这样进入NSDictionary

let dataDict = NSJSONSerialization.JSONObjectWithData(data.dataUsingEncoding(NSUTF8StringEncoding), options: nil, error: nil) as NSDictionary

let distance = dataDict.valueForKeyPath("rows.elements.distance.value")

现在,这有效,没有崩溃或错误。但是,我希望它返回 466568 而是返回:

(
        (
        466568
    )
)

我不知道为什么,我不能使用它,也不能把它转换成任何东西:(

还有另一个与此类似的问题,但那里的答案对我没有帮助,因为我不是更改 json 的人,谷歌是。所以请不要讨厌。

【问题讨论】:

【参考方案1】:

valueForKeyPath 正在返回一个嵌套的NSArray。你可能想施放两次:

let distanceValue = ((distance as NSArray).objectAtIndex(0) as NSArray).objectAtIndex(0) as NSNumber
// or
let distanceValue = (distance as [NSArray])[0][0] as NSNumber

distance 值无法直接访问,因为valueForKeyPath 没有为数组项实现选择器。

没有valueForKeyPath

let rows = dataDict.objectForKey("rows") as [NSDictionary]
let elements = rows[0]["elements"] as [NSDictionary]
let distance = elements[0]["distance"] as NSDictionary
let value = distance["value"] as NSNumber

【讨论】:

【参考方案2】:

这可能是因为 rows 给你的是数组而不是 Dictionary。因此,首先获取将为您提供数组的行的值。在数组的零索引处获取对象并将其分配给 Dictionary,然后尝试获取 elements.distance.value

【讨论】:

以上是关于ValueForKeyPath() 返回意外的东西的主要内容,如果未能解决你的问题,请参考以下文章

带有 valueForKeyPath 的嵌套 NSDictionary 返回括号而不是 NSString

swift 笔记:iOS与JavaScript的交互(二):JavaScriptCore:15。使用valueForKeyPath来返回一个上下文

妙用valueForKeyPath

希望从“valueForKeyPath”中清除“任何”值的这个 switch 语句

valueForKeyPath常用用法

valueForKeyPath常用用法