Swift AnyObject as Dictionary get element that doesn't exist is not nil
Swift AnyObject as Dictionary get element that doesn't exist is not nil
我在 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" 在日志中,当它执行下一行时崩溃
致命错误:在展开可选值时意外发现 nil
这是正常的,因为我试图打开一个 nil 值!
但我确实发现如果我这样做:
var result : [String:AnyObject] = representation as! [String : AnyObject];
if result["result"] != nil {
print("result = \(result["result"])")
result = representation["result"] as! [String : AnyObject]
}
效果很好
我知道,我知道你们中的一些人会说:你找到了一个解决方案,为什么 post 在 Whosebug-
我这样做是因为我想了解为什么第一个解决方案不起作用,并且因为我的错误肯定不是特定于此上下文的。
您的代码无法编译,因为 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)
}
因为你必须在检查之前将 representation["result"]
转换为字典,所以如果你输入 representation["result"] as! [String : 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" 在日志中,当它执行下一行时崩溃 致命错误:在展开可选值时意外发现 nil 这是正常的,因为我试图打开一个 nil 值!
但我确实发现如果我这样做:
var result : [String:AnyObject] = representation as! [String : AnyObject];
if result["result"] != nil {
print("result = \(result["result"])")
result = representation["result"] as! [String : AnyObject]
}
效果很好
我知道,我知道你们中的一些人会说:你找到了一个解决方案,为什么 post 在 Whosebug- 我这样做是因为我想了解为什么第一个解决方案不起作用,并且因为我的错误肯定不是特定于此上下文的。
您的代码无法编译,因为 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)
}
因为你必须在检查之前将 representation["result"]
转换为字典,所以如果你输入 representation["result"] as! [String : AnyObject]
它应该可以正常工作。