首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Swift的任择问题

关于Swift的任择问题
EN

Stack Overflow用户
提问于 2014-08-21 08:38:46
回答 2查看 627关注 0票数 0

我是斯威夫特的新手。

我正在努力学习基础知识和结构。我已经开始了一个项目,我正在学习随着我的进步。

代码语言:javascript
复制
fatal error: unexpectedly found nil while unwrapping an Optional value

在编写代码时,我会将上述例外情况处理几次。

虽然我读过苹果的文档,但我的头脑并不清楚。

有谁能说出这一例外及其原因的故事,这与Swift的可选性有什么关系?

谢谢

代码如下

代码语言:javascript
复制
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

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-21 09:08:15

一个变量必须始终包含一个有效值。对于值类型(int、float、strings、structs等)这意味着必须初始化变量。对于引用类型(类的实例),它们必须初始化为类的有效实例,并且不能是nil

在“迅速”中,变量不能未初始化。但是,在某些情况下,允许使用nil对变量进行非初始化或初始化。这就是为什么引入选项词的原因。可选变量可以包含其数据类型或零的有效值。一个可选变量是通过将问号后置到类型来声明的,例如:var x = Int?

建议阅读: Swift编程语言书中的选项

至于你的问题,在这里:

代码语言:javascript
复制
let tempFloat:Float! = tempDict.objectForKey("amount") as? Float

从字典中读取一个值,如果没有为nil键设置值,则可以是amount。这就是为什么有一个演员as? Float。它转换为可选类型,该类型可以包含有效的浮点类型,也可以包含零。

在赋值let tempFloat:Float!的左侧,您声明右侧不是零(通过使用感叹号),您可以使用tempFloat而不需要展开它。

如果字典包含amount键的有效浮动,那么这不是问题。但是,如果字典不包含值,则在尝试使用tempFloat变量时,会尝试将零转换为浮点数--这将导致异常。

解决办法如下:

代码语言:javascript
复制
let tempFloat = tempDict.objectForKey("amount") as? Float

if let unwrappedFloat = tempFloat {
    globalDaily = globalDaily + unwrappedFloat
}

这确保只有当tempFloat包含有效的浮点值时才使用变量(并执行加法)。

票数 1
EN

Stack Overflow用户

发布于 2014-08-21 08:57:08

我认为,只有在Float具有AnyObject类型的情况下,才能使用向下转换到AnyObject

见示例:

代码语言:javascript
复制
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类型,您可以只编写:

代码语言:javascript
复制
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
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25421788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档