在从 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 [重复]

在 NSCoder 中展开可选值时意外发现 nil

在隐式展开可选值时意外发现 nil (UICollectionView)

Swift:在展开可选值时发现 nil

URL 错误:在展开可选值时意外发现 nil:文件