Swift中的可选类型(Optional)

Swift中的可选类型(Optional)

##什么是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的杂物间

相关文章
相关标签/搜索