您的位置:首页 > 移动开发 > Swift

Swift中的可选类型(Optional)

2016-01-04 00:00 417 查看

Swift中的可选类型(Optional)

目录[-]

Swift中的可选类型(Optional)

什么是Optional

Optional后面的?跟!是什么意思?

什么时候该用!?

什么时候该用??

总结

Swift中的可选类型(Optional)

什么是Optional

Optional在Swift中表示可选类型,那么什么是可选类型?

我们都知道,在Swift中,属性的值都是不能为nil的,但是在正常情况下你不可能一开始就确定所有属性的值,又或者你根据条件查询数据,你要返回这条数据,但假如没有符合条件的数据,那该怎么办?

这时就可以使用可选类型,在Swift中,你想要让一个属性的值为nil,你必须使用Optional(可选类型),Optional其实是一个泛型enum(枚举),里面包含两种情况,一种是没有值,即nil,另外种是有值,就是你原类型的值,伪代码如下:

[code=plain]enum Optional<T> { case None case Some(T)
}

至于为什么enum可以这么写?跟其他语言中的enum不一样?这个后面有空会专门写一篇。

那么要怎样使用Optional呢?其实很简单,只需要在定义属性时,在后面跟个?或者!即可,代码如下:

[code=plain]var str:String? println(str)

这段代码会输出nil

Optional后面的?跟!是什么意思?

对于类型而言,他们没有任何区别,都是表示一个Optional类型,他们的区别只是语法上的。

?表示该属性是一个不确定值的属性,即该属性的值有可能为空 !表示该属性有值,解包当做原类型来使用,但如果该属性没有值时(即nil),会导致异常

什么时候该用!?

在你定义个一个属性,并且该属性的值在正常情况下不会为nil时,你应该直接在属性定义时使用!解包,方便后续使用,例如:

[code=plain]/* 由于这个属性与storyboard中的UILabel关联了 所以在初始化UI的时候就会自动初始化这个属性,并赋值 也就是说这个属性默认情况下有值,且后续操作中都有值(假如你不设置为nil的话) 所以这里应该使用!来解包,以简化后续操作 */ @IBOutlet var label: UILabel! override func viewDidLoad() { super.viewDidLoad() //因为属性在定义时已经解包,所以这里直接当做原类型使用,即UILabel类型 label.text = "hello" }

如果将!改成?的话,就会出现下图的错误,提示你未解包,因为?表示这个属性值不确定,即有可能为nil,如果是nil,那肯定不能操作,所以会要求你进行解包,那你就需要在每次操作label属性时加上!进行解包,就显得很麻烦





什么时候该用??

在你定义一个属性,并且该属性的值在正常情况下可能为nil时,你应该在定义属性时使用?

比如你要从数据库中获取一条记录,但该记录可能不存在,在后续的操作中,由于该属性是?(不确定值的属性),你在使用时必须要进行解包,这会提醒你该属性可能为nil,你需要判断他是否为nil,在进行相应的操作,以提高程序的健壮性

在没查询到结果的情况下:





在查询到结果情况下:





假如你在属性定义时使用了!,那么在后续操作中将不会提示你进行解包,你有可能会忘记该属性在正常情况下也会为nil,你直接把它拿来使用将会抛出异常。





总结

在Swift中Optional表示可选类型,可选类型的值可以为nil

在类型后面加上?或者!即表示可选类型

如果一个属性在正常情况下可能为nil,那最好用?,这会在你使用时提示你需要解包,你就可以使用if解包并判断其是否为nil,能提升程序健壮性

如果一个属性在正常情况下不会为nil,那最好用!,可以方便后续操作

不确定值(?) -> 确定值(!)

[code=plain]var name:String?
name = "Peter" println(name!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: