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

news2024/9/22 5:33:34

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

在这里插入图片描述

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

其实很多数据资产平台建设,没有抓住本质

其实很多企业都有建设所谓的数据资产管理平台,但本质没有抓住,叫数据管理平台可能更为贴切。原因就是大部分企业谈数据资产,都是泛泛而谈,什么是数据资产都没有弄明白,就先把功能开发好,设计出来。这种本末…

《黑神话·悟空》提高了多少游戏人的热情

《黑神话:悟空》的发布极大地提振了游戏人的热情,不管是国内游戏的带动,还是全球国产游戏的崛起,开启了国产3A游戏元年,下面我从主要两个大点来分析下。 玩家层面: 高度热情加强力追捧:从 202…

如何在算家云搭建模型MimicMotion(运动模仿)

MimicMotion (运动模仿)是具有置信感知姿势指导的高质量人体运动视频生成模型。只需要上传一张人物照片,然后再上传一段人物的舞蹈或者动作视频,就可以生成以照片中人物为原型的动作或者舞蹈视频。它可以在任何运动引导下生成任意…

采用先进的人工智能视觉分析技术,能够精确识别和分析,提供科学、精准的数据支持的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…

环网交换机的特殊作用是什么?

环网交换机作为现代网络建设的重要组成部分,具有独特而特殊的作用。在信息技术迅猛发展的今天,各类数据传输和网络连接需求日益增加,环网交换机的出现为解决这些问题提供了理想的方案。环网交换机通常将多个网络节点通过环形结构连接起来&…

Redis7基础篇(九)

springboot集成redis 目录 springboot集成redis 总体概述 java连接redis常见问题 集成jedis 集成lettuce 集成redistemplate 连接单机 ​编辑​编辑​编辑redis集群 总体概述 java要想连接mysql的话需要jdbc java想要连接redis也需要中间件 jedis是第一代 lettuce第…

python-纸牌游戏(赛氪OJ)

[题目描述] 今天你与你的挚友玩一种纸牌游戏,每一回合两人各出一张牌,如果你的牌点数大小比对方小,则你不得分,否则你的得分为两张卡牌点数差值的绝对值。 由于你有读心术,你已经知道了对方接下来要出的 n 张牌,a1​,a2​,a3​...an​。你手上…

排序问题记录-杂记

倒叙整数溢出导致没有严格按照顺序排序 实例 输出 没有按照实际大小倒排 可以替换其他方法 比如: (1)list.sort((o1, o2) -> Integer.compare(o2.getUserId(), o1.getUserId())); (2)list.sort(Comparator.comp…

Java Web —— 第七天(Mybatis案例 部门管理)

环境搭建 准备数据库表(dept、emp) -- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null commen…

网络分层(基础概念)

网络互连模型: OSI 参考模型 1.物理层 2.数据链路层 3.网络层 4.运输层5.会话层6.表示层7.应用层 TCP/IP协议: 1.网络接口层 2.网际层 3.运输层 4.应用层 1,物理层 定义接口标准、结缆标准、传输速率、传输方式等。 信道 信息传输的通道,一条传输介质上可以有…

武汉流星汇聚:体育热潮驱动市场新高峰,体育用品迎来发展黄金期

在全球体育产业的蓬勃发展中,法国作为体育大国,其深厚的体育文化底蕴和广泛的运动普及度,为体育用品市场注入了源源不断的活力。随着足球、徒步、网球等运动的持续升温,以及国际体育赛事如奥运会的临近,体育用品市场正…

量子加密算法:保障信息安全的新利器

随着信息技术的飞速发展,信息安全问题日益凸显。量子加密算法作为一种新型加密技术,以其独特的优势逐渐成为保障信息安全的重要手段。本文将简要介绍量子加密算法的原理、特点及其在我国的应用前景。 一、量子加密算法的原理 量子加密算法是基于量子力学…

Graphpad Prism for Mac 医学绘图软件教程

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试安装完成!!! 效果 一、下载软件 下载软件…

智慧楼宇公厕系统小程序,提高卫生间管理使用效率

在当今的智慧楼宇中,公厕系统的管理和使用效率成为了衡量楼宇品质的重要指标之一。智慧楼宇公厕系统小程序的出现,为解决这一问题带来了全新的思路和方法。 一、检查公厕环境数据 智慧公厕系统不仅关注如厕的基本需求,还注重提升如厕环境的质…

你了解大模型的偏见吗

随着AI大模型在各个领域的广泛应用,它们的偏见问题逐渐引起关注。 这些偏见可能无意中影响生成内容的公正性,误导用户决策,甚至加剧社会不平等。 AI偏见不仅会损害公众对技术的信任,还可能在关键领域如招聘、教育和医疗中产生不…

自定义树工具v2.0+评论回复功能开发

文章目录 1.新增评论回复1.EasyCode生成代码2.SaveShareCommentReplyReq.java3.ShareCommentReplyController.java4.ShareCommentReplyService.java5.ShareCommentReplyServiceImpl.java6.ShareMomentMapper.java 增加动态回复数7.ShareMomentMapper.xml8.测试1.评论2.评论记录…

CTFSHOW misc入门中misc8解法

第一步:下载misc8压缩包后解压缩,发现是一张misc8.png图片 第二步:老规矩,还是在kali里用binwalk命令查看文件是否包含隐藏文件,发现有两个png文件 第三步:使用binwalk -e 命令看是否能进行解析文件,结果不…

Emacs29.x版本之重要特性及用法实例(一百六十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…

如何提升网络对AI大模型流量的承载能力?

前言 随着AI大模型的兴起,数据中心正在经历前所未有的变革。AI模型的规模巨大并持续快速增长。自2017年起,AI模型的规模每半年翻一番,从初代Transformer的6500万增长到GPT-4的1.76万亿,预计下一代大语言模型的尺寸将达到10万亿。…

CSE12 Lab 4: Simple CSV File Analysis

This file shows the stock returns from an investment portfolio over a year. The “A” column contains the stock name and the “B” column indicates the returns in USD (You can assume that there are no negative stock returns in any of our CSV data files ).…