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]
}
Кроме того, вы должны сделать ваши броски безопаснее, используя 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)
}