在从 NSDictionary 获取值时展开可选值时意外发现 nil
Posted
技术标签:
【中文标题】在从 NSDictionary 获取值时展开可选值时意外发现 nil【英文标题】:Unexpectedly found nil while unwrapping an optional value while getting values from NSDictionary 【发布时间】:2015-01-20 16:39:39 【问题描述】:我正在尝试从 NSDictionary 获取值,但这里有两个地方是 EXC_BAD_INSTRUCTION 并出现致命错误。 我很感兴趣如何从 NSDictionary 获取值而没有这个问题
private func checkResponseResult(responseResult: NSDictionary)
// Initialize Group object and [Group] arrays
println(responseResult)
for item in responseResult
//create object of Group, set attributes, add to Array
var itemKey = item.key as NSString
if itemKey.isEqualToString("error")
// Error received, user has no groups assigned
println("Error: \(item.value)")
else
// Groups values received
println("Core Data insert / group id: \(item.key)")
var gr:Group = Group()
var name = "name"
var latitude = "latitude"
var longitude = "longitude"
var project = "project"
var radius = "raidus"
var val = item.value[longitude]
//return nil
println(val)
//return false
println(val==nil)
gr.id = itemKey.integerValue
gr.name = item.value[name] as String
gr.latitude = item.value[latitude] == nil || item.value[latitude] as NSNull == NSNull() ? 0.0 : item.value[latitude] as NSNumber
//fatal error: unexpectedly found nil while unwrapping an Optional value
gr.longitude = item.value[longitude] == nil || item.value[longitude] as NSNull == NSNull() ? 0.0 : item.value[longitude] as NSNumber
gr.project = item.value[project] as String
//fatal error: unexpectedly found nil while unwrapping an Optional value
gr.radius = item.value[radius] == nil || item.value[radius] as NSNull == NSNull() ? 0.0 : item.value[radius] as NSNumber
NSDictionary 在这里
30 =
latitude = "<null>";
longtitude = "<null>";
name = mtmb;
project = "pr_mtmb";
radius = "<null>";
;
【问题讨论】:
Fatal error: unexpectedly found nil while unwrapping an Optional values 的可能重复项 然后查看右侧“相关”栏中的其他十个问题。 已检查。但是我没有答案。 :-( 你知道,我希望,你不能指望找到使用完全相同的符号名称的先前问题。 @HotLicks 在 Swift 中展开可选项是一个复杂的话题,涉及到语言的所有不同部分。无论如何,您链接的问题是将 CollectionView 单元格出列并在设置标题时崩溃,这是从字典中设置模型对象的属性。 【参考方案1】:这个“item.value[latitude] == nil || item.value[latitude] as NSNull == NSNull()
”有点矫枉过正,这是旧的做法,我认为打开值以检查 NSNull 是导致崩溃的原因,创建了 Catch-22。不管 Swift 选项有更好的方法,“if let”:
if let checkedLongitude = item.value[longitude]
gr.longitude = checkedLongitude
else
gr.longitude = 0.0 as NSNumber
你不能用 ? :
短版本来做到这一点,无论如何,它只能用于最简单的 if-then。
【讨论】:
感谢您的回答。我知道这是矫枉过正,但我试图做的一切。连你的方法都行不通。相同的错误:致命错误:在展开可选值时意外发现 nil 已解决。我添加了更多代码来检查值以避免异常。这是完整代码if let checkedLongitude: AnyObject? = item.value[longitude] if let longNull = checkedLongitude as? NSNull gr.longitude = 0.0 else gr.longitude = checkedLongitude as Double else gr.longitude = 0.0
【参考方案2】:
您有两个拼写错误,一个在您的字典中,另一个在您的键中:
30 =
latitude = "<null>";
**longtitude** = "<null>";
name = mtmb;
project = "pr_mtmb";
**radius** = "<null>";
;
然后
var longitude = "longitude"
var radius = "raidus"
gr.longitude = item.value[longitude] == nil || item.value[longitude] as NSNull == NSNull() ? 0.0 : item.value[longitude] as NSNumber
gr.radius = item.value[radius] == nil || item.value[radius] as NSNull == NSNull() ? 0.0 : item.value[radius] as NSNumber
【讨论】:
以上是关于在从 NSDictionary 获取值时展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章
Swift/Xcode 9 - 应用内购买 - 在展开可选值时意外发现 nil
在获取 PHAsset 路径时展开可选值时意外发现 nil [重复]