Swift AnyObject as Dictionary get元素不存在不是nil

时间:2016-01-20 14:55:30

标签: ios swift casting anyobject

我遇到了Swift中的强制转换问题

这里是代码:

 init(response: NSHTTPURLResponse, representation: AnyObject)
{
    super.init(entity:NSEntityDescription.entityForName("File", inManagedObjectContext: NSManagedObjectContext.currentContext())!, insertIntoManagedObjectContext:NSManagedObjectContext.currentContext());

    var result : [String:AnyObject] = representation as! [String : AnyObject];
    if representation["result"] != nil {
        print("result = \(representation["result"])")
        result = representation["result"] as! [String : AnyObject]
    }
}

在某些情况下,我希望表示["结果"]等于零,在那种情况下,当我打印表示["结果"]时,debuger给我零,但我仍然通过了条件和显示"结果= nil"在日志中,当它执行下一行时,它崩溃了 致命错误:在展开Optional值时意外发现nil 这是正常的,因为我试图解开零值!

但我确实发现如果我这样做:

var result : [String:AnyObject] = representation as! [String : AnyObject];
if result["result"] != nil {
    print("result = \(result["result"])")
    result = representation["result"] as! [String : AnyObject]
}

效果很好

我知道,我知道有些人会说:你找到了一个解决方案,为什么在stackoverflow上发帖 - 我这样做是因为我想理解为什么第一个解决方案不起作用,并且因为我的错误肯定不是特定于这个背景。

2 个答案:

答案 0 :(得分:1)

representation["result"]导致

以来,您的代码无法编译
  

错误:模糊地使用'下标'

除此之外,请考虑改为使用if let

if let res = result["result"] {
    print("result = \(res)")
    result = res as! [String : AnyObject]
}

除此之外,你应该使用guard s:

让你的演员阵容更安全
guard let result = representation as? [String : AnyObject] else {
    // not a suitable dictionary
    return
}
if let res = result["result"] {
    guard let resultDic = res as? [String : AnyObject] else {
        // not a suitable dictionary neither
        return
    }
    print(resultDic)
}

答案 1 :(得分:0)

因为在检查之前必须将representation["result"]强制转换为字典,因此如果您键入representation["result"] as! [String : AnyObject],它应该可以正常工作。