-2

我在 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]
    }
}

在某些情况下,我希望表示 [“结果”] 等于 nil,在这种情况下,当我打印表示 [“结果”] 时,调试器给我 nil,但我仍然通过条件并在日志中显示“结果 = nil”,当它执行下一行它崩溃了致命错误:在展开可选值时意外发现 nil 这很正常,因为我尝试解开一个 nil 值!

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

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

它工作得很好

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

4

2 回答 2

1

您的代码无法编译,因为representation["result"]导致

错误:“下标”的使用不明确

除此之外考虑使用if let

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

除此之外,您应该使用guards 使您的演员表更安全:

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)
}
于 2016-01-20T15:05:34.657 回答
0

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

于 2016-01-20T15:06:42.077 回答