Swift 数据类型之可选值类型(Optional)详解

😄作者简介: 小曾同学.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"

在这里插入图片描述

怎么说呢?和! 的使用,大概就是使用?时,告诉编译器,我这个变量可能为空值,而!可告诉编译器,我这个变量现在虽然为空,但是你先别给我提示报错,我一会就对其进行赋值。

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小曾同学.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值