我是斯威夫特的新手。
我正在努力学习基础知识和结构。我已经开始了一个项目,我正在学习随着我的进步。
fatal error: unexpectedly found nil while unwrapping an Optional value在编写代码时,我会将上述例外情况处理几次。
虽然我读过苹果的文档,但我的头脑并不清楚。
有谁能说出这一例外及其原因的故事,这与Swift的可选性有什么关系?
谢谢
代码如下
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
}发布于 2014-08-21 09:08:15
一个变量必须始终包含一个有效值。对于值类型(int、float、strings、structs等)这意味着必须初始化变量。对于引用类型(类的实例),它们必须初始化为类的有效实例,并且不能是nil。
在“迅速”中,变量不能未初始化。但是,在某些情况下,允许使用nil对变量进行非初始化或初始化。这就是为什么引入选项词的原因。可选变量可以包含其数据类型或零的有效值。一个可选变量是通过将问号后置到类型来声明的,例如:var x = Int?。
建议阅读: Swift编程语言书中的选项。
至于你的问题,在这里:
let tempFloat:Float! = tempDict.objectForKey("amount") as? Float从字典中读取一个值,如果没有为nil键设置值,则可以是amount。这就是为什么有一个演员as? Float。它转换为可选类型,该类型可以包含有效的浮点类型,也可以包含零。
在赋值let tempFloat:Float!的左侧,您声明右侧不是零(通过使用感叹号),您可以使用tempFloat而不需要展开它。
如果字典包含amount键的有效浮动,那么这不是问题。但是,如果字典不包含值,则在尝试使用tempFloat变量时,会尝试将零转换为浮点数--这将导致异常。
解决办法如下:
let tempFloat = tempDict.objectForKey("amount") as? Float
if let unwrappedFloat = tempFloat {
globalDaily = globalDaily + unwrappedFloat
}这确保只有当tempFloat包含有效的浮点值时才使用变量(并执行加法)。
发布于 2014-08-21 08:57:08
我认为,只有在Float具有AnyObject类型的情况下,才能使用向下转换到AnyObject。
见示例:
var globalDaily:Float = 0.0
var favoritesArray:Array<Dictionary<String,AnyObject>> = []
var item:Dictionary<String,AnyObject> = ["amount": 2.0]
favoritesArray.append(item)
for var i=0; i<favoritesArray.count; ++i{
var tempDict:Dictionary = favoritesArray[i]
if let tempFloat:Float = tempDict["amount"] as AnyObject! as Float!{
globalDaily = globalDaily + tempFloat // output 2
}
else{
globalDaily = globalDaily + 5
}但是如果key不存在,我们就可以得到5
因此,如果您知道您只有Float类型,您可以只编写:
var globalDaily:Float = 0.0
var favoritesArray:Array<Dictionary<String,Float>> = []
var item:Dictionary<String,Float> = ["amount": 2.0]
favoritesArray.append(item)
for var i=0; i<favoritesArray.count; ++i{
var tempDict:Dictionary = favoritesArray[i]
if let tempFloat:Float = tempDict["amount"]{
globalDaily = globalDaily + tempFloat
}
else{
globalDaily = globalDaily + 5
}https://stackoverflow.com/questions/25421788
复制相似问题