Swift 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]
    }
}

В некоторых случаях я ожидаю, что представление ["result"] равно nil, в тех случаях, когда я печатаю представление ["result"], отладчик дает мне nil, но я все равно передаю условие и отображаю "result = nil" в журнале, и когда он выполняет следующую строку, он выдает фатальную ошибку: неожиданно обнаружил ноль при развертывании необязательного значения, что является нормальным, потому что я пытаюсь развернуть ноль!

Но я обнаружил, что если я сделаю:

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

Это работает довольно хорошо

Я знаю, я знаю, что некоторые из вас скажут: вы нашли решение, почему пишите на stackru - я сделал, потому что я хочу понять, почему первое решение не работает, и потому что моя ошибка, конечно, не специфична для этого контекста.

2 ответа

Решение

Потому что вы должны бросить representation["result"] в словарь, прежде чем проверять его, так что если вы введете representation["result"] as! [String : AnyObject] это должно работать правильно.

Ваш код не компилируется с 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)
}
Другие вопросы по тегам