😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍
可选值类型(Optional类型
)是 Swift 语言特有的一种类型,主要用于处理变量为空值的情况。在 Swift 中如果使用了一个没有赋值的变量,程序会直接报错,并停止运行。
针对“先声明后赋值”场景,使用 Optional 可以很好的解决该问题,可以看下以下示例,定一个一个变量名为 obj,但是未赋值,如果直接使用的话会提示:Variable 'obj' used before being initialized
如果把 obj 变量包装成 Optional 类型变量,在后面加上问号❓,则不会报错。
Optional 类型不会独立存在,总是依附在某个具体的数据类型之上,具体的数据类型可以是基本数据类型、结构体、类等。OPtional 类型只有两种值:
- 如果依附的变量有具体的值,则其为具体值
- 如果依附的变量没有值,则其为 nil。
实质上 Optional 类型是对普通类型的一种包装,所以呢,在使用的时候需要对其进行拆包操作,需要用到操作符!。
var obj:String? = "hello"
//拆包操作
print(obj!)
//如果没有加!,则会警告Expression implicitly coerced from 'String?' to 'Any'
另外,在使用“!”拆包时,必须保证要拆包的值不为 nil,所以,可以在拆包前进行判断
var obj:String? = "hello"
if obj != nil{
obj!
}
if-let语法结构
if-let 语法结构
来进行 Optional 类型值的绑定操作
var obj:String? = "hello"
if let tmp = obj {
print(tmp)
}else{
obj = "hello"
print(obj!)
}
如果 obj 有值,则 if let 结构将创建一个临时常量来接收 obj 拆包后的值,并且执行if为真时所对应的代码块,在执行的代码块中,可以直接使用拆包后的 obj 值 tmp。如果obj 为 nil ,则会进入 if 为假的逻辑,其中可以将 obj 重新赋值使用。再此过程中实际完成了判断、拆包、绑定拆包后的值到临时变量3个过程。
//多个Optional类型值的绑定,只有所有Optional值都不为nil,绑定才会成功
var obj:String? = "hello"
var obj1:String? = "jenny"
if let tmp = obj,let tmp1 = obj1{
print(tmp,tmp1)
}else{
obj = "hello"
print(obj!)
obj1 = "hello"
print(obj1!)
}
隐式解析
在使用之前每次都要拆包,感觉有点麻烦,在 swift 中提供了一种语法:隐式解析,例如
var obj:String! //默认值为空
obj = "hello"
怎么说呢?和! 的使用,大概就是使用?时,告诉编译器,我这个变量可能为空值,而!可告诉编译器,我这个变量现在虽然为空,但是你先别给我提示报错,我一会就对其进行赋值。