当前位置: 首页 > news >正文

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"

在这里插入图片描述

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

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Sass实现网页背景主题切换
  • python3爬虫(未完结)
  • 产业园区智慧公寓管理系统
  • Springboot项目配置shiro报错No SecurityManager accessible to the calling code
  • java之类和对象的介绍
  • etcd启动和测试
  • PyTorch 基础学习(13)- 混合精度训练
  • C++ 设计模式——建造者模式
  • Redis—持久化机制
  • StarRocks 存算分离数据回收原理
  • jpg怎么转换成pdf?6个简单方法,实现jpg转换成pdf
  • 设计模式(一):单例模式
  • 数字IC/FPGA中有符号数的处理探究
  • Python|OpenCV-基于OpenCV进行图像的复制与克隆(19)
  • 第五章 设置和其他常见活动 - 创建 IRIS 凭证集
  • const let
  • CSS中外联样式表代表的含义
  • ES2017异步函数现已正式可用
  • ES6简单总结(搭配简单的讲解和小案例)
  • Fastjson的基本使用方法大全
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Java的Interrupt与线程中断
  • PAT A1092
  • Rancher如何对接Ceph-RBD块存储
  • scala基础语法(二)
  • 从零搭建Koa2 Server
  • 简析gRPC client 连接管理
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 算法之不定期更新(一)(2018-04-12)
  • 一、python与pycharm的安装
  • ionic异常记录
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #define与typedef区别
  • (floyd+补集) poj 3275
  • (zhuan) 一些RL的文献(及笔记)
  • (第一天)包装对象、作用域、创建对象
  • (力扣)循环队列的实现与详解(C语言)
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)可以带来幸福的一本书
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 8 跨平台高性能边缘采集网关
  • .NET Core中如何集成RabbitMQ
  • .Net7 环境安装配置
  • .NET8使用VS2022打包Docker镜像
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [android] 请求码和结果码的作用
  • [BSGS算法]纯水斐波那契数列
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [C#小技巧]如何捕捉上升沿和下降沿