##什么是Optional数据库
Optional在Swift中表示可选类型,那么什么是可选类型?swift
咱们都知道,在Swift中,属性的值都是不能为nil
的,可是在正常状况下你不可能一开始就肯定全部属性的值,又或者你根据条件查询数据,你要返回这条数据,但假如没有符合条件的数据,那该怎么办?ide
这时就可使用可选类型,在Swift中,你想要让一个属性的值为nil
,你必须使用Optional(可选类型),Optional实际上是一个泛型enum(枚举),里面包含两种状况,一种是没有值,即nil
,另外种是有值,就是你原类型的值,伪代码以下:code
enum Optional<T> { case None case Some(T) }
至于为何enum能够这么写?跟其余语言中的enum不同?这个后面有空会专门写一篇。get
那么要怎样使用Optional呢?其实很简单,只须要在定义属性时,在后面跟个?
或者!
便可,代码以下:博客
var str:String? println(str)
这段代码会输出nilio
##Optional后面的?
跟!
是什么意思?class
对于类型而言,他们没有任何区别,都是表示一个Optional类型,他们的区别只是语法上的。泛型
?
表示该属性是一个不肯定值的属性,即该属性的值有可能为空 !
表示该属性有值,解包当作原类型来使用,但若是该属性没有值时(即nil
),会致使异常语法
###何时该用!
?
在你定义个一个属性,而且该属性的值在正常状况下不会为nil
时,你应该直接在属性定义时使用!
解包,方便后续使用,例如:
/* 因为这个属性与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
,那最好用!
,能够方便后续操做
不肯定值(?
) -> 肯定值(!
)
var name:String? name = "Peter" println(name!)
本文转自本人独立博客,更多文章请访问 -> Yenn的杂物间