可选类型
上一节我们介绍了数据类型,其中有个类型叫做可选类型,这节我们专门讨论一下。
什么叫可选类型?
《老子》有云:“天下万物生于有,有生于无”,也就是说,本来什么都没有,然后就有某个物了,再然后万物就出现了。这段描述,放在计算机程序中特别合适。
某个变量,可以是空无的状态,用nil
表示;也可以是有Int
,有string
,有Double
等。
哪些情况会出现可选类型?
比如,我们将一个String类型强制转换为Int类型时
var a = Int("Hello")
print(type(of: a)) //"Optional<Int>\n"
print(a) //"nil\n"
// 打印的结果是,a是一个Optional<Int>类型,就是说a要么是Int型,要么就是nil
// 在这里,a没有转换成功,所以a的值是nil
再看这个例子
var b = Int("123")
print(type(of: b)) //"Optional<Int>\n"
print(b) //"Optional<123>\n"
// b同样是个Optional<Int>类型
// 直接print(b)实际上是一种隐式解析
注意:nil不会单独出现,它只出现在可选类型中
var a = nil
是错误的,nil只能用于可选值。
如何使用可选类型?
声明一个变量时,在类型后面加?,就得到一个该类型的可选类型。比如
var a: String? = nil
var b: String? = "Hello"
我们定义了a,b两个String可选变量,就是说,a,b要么有string类型的值,要么是空值。
这里,我们给a同时赋予了nil的空值,b则赋予了"Hello"的值。
那么,我们如何调用这两个可选值呢?
如果我们直接调用变量,比如print(a)
,Xcode会有黄色提示Expression implicitly coerced from 'Int?' to 'Any'
,这是因为,a是可选类型,状态不稳定,计算机拒绝接收这种未知状态,咱毕竟还不是量子计算机。因此,我们要采取某种措施,让可选类型塌缩。
- 强制解析
在可选类型的变量后面加!,强制解析变量中的非空值。
print(a!)
,这样会出错,因为a是空值,解析不到非空值,就报错了。
print(b!)
,这样没问题,因为b有非空值"Hello"。
因此,如果你确定你使用的变量有非空值时,可以采用这种强制解析方式,但是大部分情况下是危险的。
- 强制解析
-
- 先判断,再解析
借用if语句,判断变量是不是非空值,如果是非空值,再强制解析。
if a != nil { print(a!) } // a 不等于 nil,这个条件不成立,因此这句代码没有执行 if b != nil { print(b!) } // Hello // b 不等于 nil,这个条件成立,因此强制解析b,并打印出来
- 先判断,再解析
-
- 可选绑定
if let v1 = a { print(v1) } // a赋值给常量v1,作为判断条件,赋值不成功,该语句不执行。 if let v2 = b { print(v2) } // b赋值给常量v2,赋值成功,语句执行
还有几种解析形式,比如使用三元运算符,空合运算符等,逻辑大体相似,这里就不再赘述了。
小结与预告
数据类型已经讲完了,下节,我们再继续掌握一些必须的相关知识点。
网友评论