可选和nil的恋情
先看一个例子吧!
let str="hello world"
let num:Int=Int(str)
这两行代码的意思str字符串转换成Int类型,嘿嘿!这不是坑计算机吗?hello world能转换成Int类型的数字吗?很显然不能,而且我们运行都不会通过的!
可是我们把第二行代码换成
let num:Int?= Int(str)
编译就通过了!就这样可选类型就呼之欲出!
定义:
在任何类型后面紧跟一个?就可以代表可选类型,可选类型的变量可用于处理“值缺失”的情况。
Int类型的变量或常量只能接受Int类型的数据,而Int?可以接受值缺失的状况,也就是能接受值为nil。
var age:Int=nil 这个显然是错误的
var age:Int?=nil 这个是可以的
注意:Int?和Int类型并不是相同的类型,程序不能直接把Int?类型的变量或者常量直接拿来当Int类型的变量或常量使用。
强制解析
为了获取可选类型的常量或变量的实际存储值需要用在后面加!进行解析。这个!的含义是:已经知道该可选变量有值了(要是实际里面没有值系统就会崩溃),提取里面的值。这种添加感叹号进行解析的用法叫做强制解析。
例如:
let str1:String?="hello"
let str2:String?=" word"
let result = str1! + str2!
print(result)
之前说了使用!的前提是可选变量确实有值了,否则就会崩溃,所以我们需要提前判断可选类型是否有值。所以上面的代码这样写才正规一些:
let str1:String?="hello"
let str2:String?=" word"
if str1 != nil && str2 != nil
{
let result = str1! + str2!
print(result)
}
else
{
print("str1或者str2为nil,不能强制解析")
}
}
隐式可选类型
除了在任意已有类型后面添加?来表示可选类型外,可以加!来表示可选类型。
其中Int?和Int! 类型的区别在于:当用Int?表示可选类型的时候必须用!后缀强制解析,而程序用!类型表示可选变量时,无需在后面增添!后缀执行强制解析。Swift会自动执行隐式解析。
let str1:String!="hello"
let str2:String!=" word"
if str1 != nil && str2 != nil
{
let result = str1 + str2
print(result)
}
else
{
print("str1或者str2为nil,不能强制解析")
}
最后用一个表清晰展示下可选类型的差异吧!
Int | Int? | Int! |
---|---|---|
是否可存储整数 | 是 | 是 |
是否接受nil | 否 | 是 |
是否需要强制解析为Int | 否 | 是 |