ios - Swift 上的可选问题

标签 ios exception swift

我是 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?

推荐阅读:OptionalsSwift 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/

相关文章:

servlets - FILterChain异常处理

ios - 如何使用手动UITabbar并使用它来切换其他ViewController?

ios - Swift:通过单击按钮修改数据格式

ios - CocoaPods:[!] 无法找到 'Surge4Swift3' 的规范

ios - 使用swift访问firebase中特定键的值

ios - 有没有地方可以查看iOS源代码?

ios - 在 iOS 中从字符串转换日期?

iOS 应用程序永远不会退出 map

git - 有没有办法通过prepare-commit-msg独立地在 `git commit`上强制发送一条消息?

java - XStream、循环引用异常