Swift的可选绑定(Optional binding)

在Swift中,有一种变量称为可选变量(Optional),具体说明见Swift初步入门。这种变量的值可以存在也可以为空(nil)。在Swift中,可以通过将if语句和赋值语句结合,有条件地展开(unwrap)可选变量,即在该可选变量值不为nil的前提下展开。这种展开方式称为"可选绑定"(Optional binding)。文章Unwrapping Optionals With Optional Binding in Swift - Khawer Khaliq和swift那点事儿之optional(可选绑定)_swift initializer for conditional binding must hav-CSDN博客等都对这种绑定方式做了说明,但使用的例子或是涉及类,甚至涉及网络爬虫,并不是用最简洁的方式介绍可选绑定的使用方式。本文用简单的例子来介绍"可选绑定"的使用方法。在本文的例子中,只使用基本的变量类型。

一、可选绑定的基本介绍

在这里,以一个简单的Int?类型的变量开始。

var x:Int? = 3

现在设计一个逻辑:如果x值不是nil,就将其转化为二进制,否则不要转。不使用这样的句式:

if x != nil {}

可以这样写:

var x:Int? = 3
var binStr:String = ""
if let xValue = x{ //xValue is the deoptionalized x if x contains valuebinStr = String(xValue, radix:2)
} 
print("x=3 converted to binary is \(binStr)")
x = nil
if let xValue = x{ //non-nilbinStr = String(xValue, radix:2)
}
else{ //nilprint("x=nil is nil now")
}

在该代码中,if let xValue = x表明如果x不为nil,那么就会执行xValue = x语句并给出true的判断结果,进入if分支;如果x为nil,就直接进入else分支。注意,xValue在这里不是可选变量,而是已被展开的x

运行结果为:

x=3 converted to binary is 11
x=nil is nil now

注意let xValue = x不要加括号!以下写法是非法的:

if (let xValue = x){}

其实还有一种更简单的写法

let y:Int? = 10
//a more easy way
if let y{binStr = String(y,radix: 2)print("y=10 converted to binary is \(binStr)")
}//here y is temporarily used as a non-optional inside the if statement
print("now y is still \(y)")//see it is still optional. Remember that in optional binding the non-optional variable is temporary 

在该代码中,如果y值不为nil,那么y就会自动转化为正常的、非可选的Int类型进入if分支。也就是说,在语句binStr = String(y,radix: 2)中,y是Int而非Int?类型。但是,离开if分支后,y会恢复为Int?类型。所以,运行结果为:

y=10 converted to binary is 1010
now y is still Optional(10)

二、一个简单但有用的例子

如果我们要把字符串用于数字运算上,肯定要先把它转化为数值类型。但是,并不是所有的字符串都能转化为数值类型的。Int()是一个转化的函数,但结果也是可选的Int?类型(转化失败就输出nil)。所以,我们可以用可选绑定来用简单的语句设计程序。

可以这样写:

if let aa = Int("1"), let bb = Int("2"), aa < bb{print("aa < bb")
} //This is a way of writing several optional binds into an if statement (use comma)

注意,在Swift中,可以用逗号(comma)分割不同的条件判断语句。可以阅读这篇文章:Swift条件判断中的逗号_swift if判断 性能 & ,-CSDN博客。

所以在该代码中,Int("1")Int("2")输出的都是Int?类型,但只要值不为nil(转化成功),变量aabb都是Int类型,可以参与aa<bb的数字判断。

运行结果为:

aa < bb

还可以这样写

let aa:Int? = Int("1")
let bb:Int? = Int("rr")
if let aa, let bb, aa < bb{print("aa < bb")
}
else{print("At least one of them is not a number so not comparable")
}//this writing is ok too

运行结果为:

At least one of them is not a number so not comparable

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文详细深入总结服务器选型

1. 题记&#xff1a; 服务器选型工作是项目规划检讨的一项非常重要的工作&#xff0c;本文详细深入总结服务器选型。 2. 服务器基础知识概览 2.1 服务器的定义与功能 2.1 .1 定义 服务器是一种高性能计算机&#xff0c;其设计目的是在网络中提供服务。它可以处理来自多个客…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库&#xff0c;用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具&#xff0c;使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码&#xff0c;并在本地进行编译。 TilesB…

车载诊断架构 --- 关于DTC的开始检测条件

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

AI大模型(一):Prompt AI编程

一、Prompt Engineering&#xff0c;提示工程 提示工程也叫指令工程&#xff1a; Prompt是发给大模型的指令&#xff0c;比如【讲个睡前故事】、【用Python写个消消乐游戏】等&#xff1b;本质上大模型相关的工程工作&#xff0c;都是围绕prompt展开的&#xff1b;提示工程门…

如何在 Ubuntu 上安装 Jellyfin 媒体服务器

Jellyfin 是一个开源的媒体服务器软件&#xff0c;让你可以整理、管理和流式传输你的个人媒体收藏&#xff0c;比如电影、音乐、电视节目和照片&#xff0c;而且完全免费&#xff0c;没有订阅费用或数据收集的担忧。 简介 媒体管理&#xff1a;Jellyfin 整理媒体库&#xff0…

数据结构(初阶4)---循环队列详解

循环队列 1.循环队列的结构  1).逻辑模式 2.实现接口  1).初始化  2).判断空和满  3).增加  4).删除  5).找头  6).找尾 3.循环队列的特点 1.循环队列的结构 1).逻辑模式 与队列是大同小异的&#xff0c; 其中还是有一个指向队列头的head指针&#xff0c; 也有一个指向尾…

Qwen2.5-Coder-32B-Instruct Docker 部署openai接口

Qwen2.5-Coder-32B-Instruct 模型下载,国内快捷方式: conda create -n modelscope python=3.10 conda activate modelscopepip install modelscopemodelscope download --model Qwen/Qwen2.5-Coder-32B-Instruct --local_dir /ssd/xiedong/Qwen/Qwen2.5-Coder-32B-I

图形几何之美系列:二维凸包艺术赏析

“凸包是计算几何中的概念&#xff0c;凸包在多个领域中有广泛的应用&#xff0c;主要包括几何计算、图形处理、优化问题、路径规划等。” 1.前言 凸包话题包括二维凸包、三维凸包以及高维凸包。对于平面点集&#xff0c;探究如何构造可以覆盖给定点集最小的凸多边形&#xff1…

速通前端篇 —— HTML

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 HTML的介绍 如何创建HTML文件 HTML 文件基本结构 HTML常用标签 title标签 标题标签 h1-h6 段落标签 p 换行标签 b…

shell编程--永久环境变量和字符串显位

环境变量 echo $HOME 在终端输出后会显示家目录有个root变量 我们会提出个疑问为什么平时我们在终端输入sl 或者which等等命令会输出一些内容呢&#xff0c;这是因为这些命令都有对应的环境变量。 我们查看一下环境变量 在终端输入&#xff1a; echo $PATH 我们看一下输出…

Python毕业设计选题:基于django+vue的二手物品交易系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 店铺管理 二手物品管理 广告管理 留言反馈 订单…

Spring:bean的配置

对于bean的配置中&#xff0c;主要会讲解bean基础配置,bean的别名配置,bean的作用范围配置(重点),这三部分内容&#xff1a; bean基础配置 id与class配置 bean的name属性 bean的别名配置 bean作用范围scope配置 scope使用后续思考 介绍完scope属性以后&#xff0c;我们…

前端无感刷新token

摘要&#xff1a; Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌&#xff08;access token&#xff09;的技术&#xff0c;确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项&#xff1a; 访问…

图形 2.6 伽马校正

伽马校正 B站视频&#xff1a;图形 2.6 伽马校正 文章目录 伽马校正颜色空间传递函数 Gamma校正校正过程为什么需要校正&#xff1f;CRT与转换函数 为什么sRGB在Gamma 0.45空间&#xff1f; 人对亮度的敏感韦伯定律中灰值 线性工作流不在线性空间下进行渲染的问题统一到线性空…

【redis】—— 环境搭建教程

上一节&#xff0c;我们大致了解了Redis的几个重要版本&#xff0c;在本教程中&#xff0c;我们选择了5.0版本&#xff0c;因为5.0已经具备了大部分的功能特性&#xff0c;并且与7.0版本相比&#xff0c;其安装使用过程更为简便。 Redis的官方并不直接支持微软的Windows操作系统…

Springboot采用jasypt加密配置

目录 前言 一、Jasypt简介 二、运用场景 三、整合Jasypt 2.1.环境配置 2.2.添加依赖 2.3.添加Jasypt配置 2.4.编写加/解密工具类 2.5.自定义加密属性前缀和后缀 2.6.防止密码泄露措施 2.61.自定义加密器 2.6.2通过环境变量指定加密盐值 总结 前言 在以往的多数项目中&#xff0…

【机器学习导引】ch6-支持向量机

参考链接 【数之道】支持向量机SVM是什么&#xff0c;八分钟直觉理解其本质 间隔与支持向量 **问题引入&#xff1a;**在样本空间中寻找一个超平面&#xff0c;将不同类别的样本分类 超平面&#xff1a;在支持向量机中&#xff0c;模型的目标是找到一个能够分开不同类别的平…

详解map与multimap容器

目录 一、map简介 1.map构成 2.map本质 3.map的优点 4.map和multimap区别&#xff1a;map不允许容器中有重复key值元素。multimap允许容器中有重复key值元素。 5.map的构建 6.map的赋值 1️⃣赋值法 2️⃣拷贝赋值法 7.map的成员函数 &#xff08;1&#xff09;inse…

PyAEDT:Ansys Electronics Desktop API 简介

在本文中&#xff0c;我将向您介绍 PyAEDT&#xff0c;这是一个 Python 库&#xff0c;旨在增强您对 Ansys Electronics Desktop 或 AEDT 的体验。PyAEDT 通过直接与 AEDT API 交互来简化脚本编写&#xff0c;从而允许在 Ansys 的电磁、热和机械求解器套件之间无缝集成。通过利…

ubuntu将firewall-config导出为.deb文件

firewall-config ubuntu是canonial 公司维护的&#xff0c;用wireshark测过&#xff0c;开机会给他们公司发遥测&#xff08;开了ufw阻塞所有连接也一样&#xff0c;canonial在里面把代码改了&#xff09;firewall-config是fedora(爱好者维护&#xff0c;公益版本)自带的防火墙…