2016-01-20 6 views
-2

Я столкнулся с проблемой с броском в SwiftSwift AnyObject в словарь получить элемент, который не существует, не ноль

Вот код:

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"], debuger дает мне ноль, но я все еще передаю условие и отображаю «result = 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- I потому что я хочу понять, почему первое решение не работает, и потому что моя ошибка, конечно, не является специфической для этого контекста.

ответ

0

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

1

Ваш код не компилируется, поскольку representation["result"] приводит

error: ambiguous use of 'subscript'

Помимо этого рекомендуется использовать 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) 
} 
+0

Thx для ответа, мой код компилируется, я не знаю, почему он не скомпилирован на вашей стороне второй, в реальности я использовал: if let result = (представление ["result"] ?? в виде? [String: AnyObject], чтобы проверить, но для моего объяснения я хотел быть более общим. Ответ, который я искал, - это от Хусейна Альзана, где мне нужно было отливать, когда я сравниваю, поэтому в конце я делаю = если пусть result = ((представление ["result"] as? [String: AnyObject]) ??)) ? [String: AnyObject] – Fogia

+0

Извините, но он компилируется! Я не принял вашего ответа, потому что Хусейн объяснил, что актерский состав должен быть сделан и на сравнении. – Fogia