可选型(optional)

来源:互联网 发布:广东体育网络体育直播 编辑:程序博客网 时间:2024/05/17 09:32

一个值,可能有值,也可能为nil,存在不确定性,即为可选型。

let possibleNumber = “三”let convertedNumber = Int(possibleNumber)//nillet possibleNumber2 = “123let convertedNumber2 = Int(possibleNumber2)//123

如上,possibleNumber的值不一定能够转换成功,如果possibleNumber为字符或者字符串,则convertedNumber的值为nil,因此,possibleNumber为可选值

可选型的声明如下:
let possibleNumber : Int?
如果确认可选型的值不为nil,那么可以使用解包(!)的方式,获取它的值,如下:

possibleNumber=1if possibleNumber != nil{    print("possibleNumber不为空,值为:\(possibleNumber!)")}

我们为可选型的possibleNumber赋值为1,那么此时判断可选型不为nil,即可解包获取possibleNumber的值

可选绑定(optional binding)
使用可选绑定来判断可选值是否有值,如果有值,则赋给该值。
所谓的可选绑定,就是把可选型赋给一个变量或者常量,如果赋值后需要改变该值,则需要赋值给变量,否则赋给常量。如下

let possibleNumber : Int?possibleNumber = nilif let actualNumber = possibleNumber{    print("可选型的值为:\(actualNumber)")}else{    print("可选型的值为:nil")}

可以包含多个可选绑定在if语句中,并使用where子句做布尔值判断。

if let firstNumber = Int("4"),secondNumber = Int("42") where firstNumber < secondNumber {    print("\(firstNumber)<\(secondNumber)")}

隐式解析可选
如上,可选暗示了常量或者变量可以为“nil”。
可选可以通过if来判断是否有值,如果有值,可以通过解包或者可选绑定来解析值。
有时候,在程序中,可选被第一次赋值后,可以确定为一个总有值的可选。但是每次都要判断和解析,则是非常低效的。因此,有一种类型被定义为:隐式解析可选(implicitly unwrapped optionals),不需要每次都解析,但是仍需要判断是否有值。因为隐式解析可选,如果没有值的情况下取值,会引发运行时异常。具体办法看后面的两种解决方式。

//普通解析可选var possibleString : String? = "普通解析可选"print("字符串:\(possibleString!)")
//隐式解析可选var possibleString2 : String! = "隐式解析可选"print("字符串:\(possibleString2)")

注意:如果在隐式解析可选没有值的情况下尝试取值,会触发运行时错误。(顺带,如果在普通解析可选没有值的情况下,取值时加上!,也会触发错误)因此,有以下两种解决方法:

//判断是否为空var possibleString3 : String!if possibleString3 != nil{    print("隐式解析可选,值为:\(possibleString3)")}else{    print("隐式解析可选,值为:nil")}
//通过可选绑定判断是否为空possibleString3 = "隐式解析可选有值"if let possible = possibleString3{    print("隐式解析可选:\(possibleString3)")}else{    print("隐式解析可选,值为:nil")}

注意:
1、你可以把隐式解析可选当做是一个自动解析的可选,只是把解析的感叹号放到类型的末尾,而不是每次解包的时候放到可选名字的后面。
2、swift中的nil和objective-c中的nil并不一样。在objective-c中,nil是一个指向不存在对象的指针。在swift中,nil不是指针,它是一个确定的值,用来表示值缺失,任何类型的可选都可以被设置为nil,不只是对象类型。
3、一个变量如果之后可能变为nil的话,不要使用隐式解析可选。如果需要在变量的生命周期中判断是否是nil的话,使用普通可选类型。(意思就是说,不要瞎费劲,根据实际情况选择解析可选的类型)。
4、当可选被第一次赋值之后一直有值的时候,隐式解析可选非常有用。隐式解析主要被用在swift中类的构造过程中,具体后面我在补充。

0 0
原创粉丝点击