一,可选(Optionals)类型
什么是可选类型呢,简言之,就是用 let/var 定义的一个值,可以为nil。可选类型又课程之为可选项。
二,可选类型的定义
- 1、在类型后面加上后缀 ? 来定义一个可选项(常用)
- 2、直接用标识Optional来表示,Optional<String>
var name: String? = "小张"
name = nil // 此时name 是可以赋值为 nil 的
var name1: Optional<String> = "小张"
var age: Int? // 先定义后赋值
age = 18
age = nil
let age2: Int? // 也可以定义为常量
age2 = 30
注意:从数组和字典中取出的值其实也是可选类型的
// 数组
var numbers = [1, 2, nil, 3]
print(numbers[0])
print(numbers[2])
// 字典
var numberDic = ["age" : "18", "name" : "zxd", "height" : nil]
print(numberDic["age"])
print(numberDic["height"])
image.png
三,强制解包
从上面的打印结果来看,数组或是字典的取值,都会有OPtional()这个东西,说明这些值是可选类型。
所以说,可选类型是对其他类型的一层包装,可以将它理解成一个盒子
- 1,如果是nil,那么就是一个空盒子
- 2,如果不是nil,那么盒子里装的是:被包装类型的数据
如果要将Optional()中的值取出来(将盒子里面的东西取出来),需要使用感叹号 ! 强制解包
例如:
var name: String? = "小张"
print(name)
print(name!)
// 打印结果
Optional("小张")
小张
注意:如果可选类型是nil,在进行强制解包,会产生运行时错误
// 如果值为nil,强制解包就会报错
var name2: String? // 默认是nil
print(name2!)
// 报错
Fatal error: Unexpectedly found nil while unwrapping an Optional value: file 04 可选类型.xcplaygroundpage, line 33
Playground execution failed:
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
四,可选项绑定
由上面的例子可以看出,可选类型在强制解包时是非常危险的,指不定那个地方就为Nil了。所以一般在使用时,首先要判空。
所以,就可以用 可选项绑定 来判断可选项 是否有值
如果有值就自动解包,将值赋值给一个临时变量或常量,并返回true,否则返回false
// Int转换,返回的结果就是一个可选类型
var number = Int("123")
// 通过可选项绑定,来判断
if let number = Int("123") {
print("转换成功:\(number)")
// number 就是 强制解包 后的值,number!
// number 的作用域就是这个{}内
}else {
print("转换失败")
}
五,自动解包(隐式解包)
// 自动解析(隐式解包)
var num1: Int! = 10
var num2: Int = num1
if num1 != nil {
print(num1 + 10) // 20
}
if let num3 = num1 {
print(num3) // 10
}
var num4: Int! = nil
var num5: Int = num4
// 报运行时错误,所以一般在开发中不建议 使用 隐式解包 的写法
网友评论