我是 Swift 的新手。
我正在尝试学习基础知识和结构。我已经开始了一个项目,我边学边学。
fatal error: unexpectedly found nil while unwrapping an Optional value
我在编码时出现了几次上述异常。
虽然看了苹果的文档,但是脑子不太清楚。
谁能说说这个异常及其原因,它与 Swift 上的 Optional 有什么关系?
谢谢
代码如下
var globalDaily:Float = 0.0
for var i=0; i<favoritesArray.count; ++i {
var tempDict:NSMutableDictionary = favoritesArray.objectAtIndex(i) as NSMutableDictionary
let tempFloat:Float! = tempDict.objectForKey("amount") as? Float
globalDaily = globalDaily + tempFloat//This line gives the bad access
}
最佳答案
在 swift 中,变量必须始终包含有效值。对于值类型(int、float、strings、structs 等),这意味着必须初始化变量。对于引用类型(类的实例),它们必须被初始化为类的有效实例并且不能为 nil
。
在 swift 中,变量不能保持未初始化状态。但是在某些情况下,允许变量未初始化或使用 nil
进行初始化。这就是引入可选 概念的原因。可选变量可以包含其数据类型的有效值,或 nil。可选变量通过在类型后缀问号来声明,例如:var x = Int?
。
推荐阅读:Optionals在 Swift Programming Language 一书中。
至于你的问题,在这里:
let tempFloat:Float! = tempDict.objectForKey("amount") as? Float
您从字典中读取一个值,如果没有为 amount
键设置值,则该值可以是 nil
。这就是为什么有一个 cast as? float
。转换为可选类型,该类型可以包含有效的 Float 类型或 nil。
在赋值的左侧 let tempFloat:Float!
您声明右侧不是 nil(通过使用感叹号),并且您可以使用 tempFloat
而不打开它。
如果字典包含 amount
键的有效 float ,那么这不是问题。但是,如果字典不包含值,则当您尝试使用 tempFloat
变量时会尝试将 nil 转换为 Float - 这会导致异常。
解决方法如下所示:
let tempFloat = tempDict.objectForKey("amount") as? Float
if let unwrappedFloat = tempFloat {
globalDaily = globalDaily + unwrappedFloat
}
这确保您仅在 tempFloat 包含有效浮点值时才使用变量(并进行加法)。
关于ios - Swift 上的可选问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25421788/