1.为什么使用optional
由于swift语言是类型安全的,即在初始化变量或常量时,不能将其赋值为nil,否则会报错:
var a = nil
然而,我们在定义变量时并不一定要初始化,函数的返回值并不一定有具体的值,这就为我们使用变量带了不便,故swift提供了optional,即可选类型,来缓解这个问题。
可选类型,顾名思义即使用该类型的声明的变量可以有值,亦可以没有值(nil)。
2.optional的使用
在swift中,在声明变量的类型后面加上?
即可申明可选类型:
var str: String? = "abc"
由于可选类型变量的值有可能为nil
,故不能直接使用,在swift中,主要有以下四种方式使用optional
:
-
optional拆包
var str: String? = "abc" print(str!.count) // 使用!进行拆包
-
optional隐式拆包
var str: String? = "abc" print(str!.count)
-
optional binding
var str: String? = "abc" if let realStr = atr { print(realStr.count) }
-
optional选择链
var str: String? = "abc" let count = str?.count // count仍是可选类型 // 对count使用拆包方式进行访问 if count != nil { let lastIndex = count! - 1 print(lastIndex) }
3.optional原理浅析
optional并不是swift语言本身带有的特性,而是通过枚举实现的,下图是swift源码截图
我们可以通过如下方式定义可选类型,其效果完全等同于上述使用?
的方式
var str: Optional<String> = "abc"
if let realStr = str {
print(realStr)
}
我们还可以使用Optional
泛型提供的unsafelyUnwrapped
方法进行解包:
var str: Optional<String> = "abc"
let count = str.unsafelyUnwrapped.count
print(count)