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

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

相关文章:

Swift的可选绑定(Optional binding)

在Swift中&#xff0c;有一种变量称为可选变量&#xff08;Optional&#xff09;&#xff0c;具体说明见Swift初步入门。这种变量的值可以存在也可以为空&#xff08;nil&#xff09;。在Swift中&#xff0c;可以通过将if语句和赋值语句结合&#xff0c;有条件地展开&#xff0…...

硬石电机学习2024116

F4 概况 共模抑制线圈作用是滤波 LD3.3是将5v转为芯片用的3.3V CH340用于板子和电脑通讯 光耦隔离保护主控 16M的外部flash 1M的芯片内部的flash 10kHZ高速的光耦隔离&#xff0c;1M的低俗光耦隔离 F4 stm32概况 stm8和51都是一次可以运算处理8位的 32表示一次处理32位…...

行业类别-金融科技-子类别区块链技术-细分类别智能合约-应用场景供应链金融课题

1.大纲分析 针对题目“行业类别-金融科技-子类别区块链技术-细分类别智能合约-应用场景供应链金融课题”的大纲分析,以下是一个详细的结构: 一、引言 简述金融科技的发展背景与重要性引出区块链技术在金融科技中的应用强调智能合约作为区块链技术的重要细分类别提出供应链金…...

ElementPlus el-upload上传组件on-change只触发一次

ElementPlus el-upload上传组件on-change只触发一次 主要运用了:on-exceed方法 废话不多说&#xff0c;直接上代码 <el-uploadclass"avatar-uploader"action"":on-change"getFilesj":limit"1":auto-upload"false"accep…...

论文阅读:Uni-ISP Unifying the Learning of ISPs from Multiple Cameras

这是 ECCV 2024 的一篇文章&#xff0c;文章作者想建立一个统一的 ISP 模型&#xff0c;以实现在不同手机之间的自由切换。文章作者是香港中文大学的 xue tianfan 和 Gu jinwei 老师。 Abstract 现代端到端图像信号处理器&#xff08;ISPs&#xff09;能够学习从 RAW/XYZ 数据…...

AntD表单自定义组件

前言 表单可以说是前端最常见的一种组件&#xff0c;特别是在进行搜索的时候使用的最频繁&#xff0c;自定义表单组件&#xff0c;丰富了搜索框的类型&#xff0c;使数据展现的更灵活 内容讲解 1、官方介绍 AntD-Formhttps://ant.design/components/form-cn#form-demo-cust…...

19-简单理解JavaScript中的Promise:手写Promise实现

笔记分享 在现代JavaScript开发中&#xff0c;异步编程是不可避免的一部分。为了更好地处理异步操作&#xff0c;ES6引入了Promise。Promise使得异步代码更具可读性和可维护性。通过手写一个完整的Promise实现&#xff0c;可以帮助你更深入地理解其工作原理。本文将详细介绍Pr…...

elementUI input 禁止内容两端存在空格,或者是自动去除两端空格

需求 项目中有需求&#xff1a;输入框中禁止内容两端存在空格&#xff0c;或者是自动去除两端空格。 解决方法 vue的api文档中有过介绍&#xff0c;使用.trim可以去掉用户输入内容中两端的空格&#xff0c;如下图 代码 <el-input v-model.trim"name" cleara…...

Go语言24小时极速学习教程(一)基础语法

Go语言&#xff08;也称为Golang&#xff09;是一种由Google开发的编程语言&#xff0c;以其简洁、高效和并发支持而闻名。从本文开始&#xff0c;将带你快速完成Go语言的学习&#xff0c;如果你之前有过Java或者C语言的基础&#xff0c;学习它将很容易&#xff0c;本教程忽略环…...

LLMs之Code:Qwen2.5-Coder的简介、安装和使用方法、案例应用之详细攻略

LLMs之Code&#xff1a;Qwen2.5-Coder的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;这篇论文介绍了Qwen2.5-Coder系列模型&#xff0c;这是一个针对代码生成的强大开源大型语言模型。 >> 背景痛点&#xff1a;现有代码大型语言模型的不足&#xff1a;虽然…...

pytest结合allure做接口自动化

这是一个采用pytest框架&#xff0c;结合allure完成接口自动化测试的项目&#xff0c;最后采用allure生成直观美观的测试报告&#xff0c;由于添加了allure的特性&#xff0c;使得测试报告覆盖的内容更全面和阅读起来更方便。 1. 使用pytest构建测试框架&#xff0c;首先配置好…...

TypeScript简介:TypeScript是JavaScript的一个超集

官方描述&#xff1a;TypeScript 是 JavaScript 的一个超集 GitHub官网&#xff1a;https://github.com/Microsoft/TypeScript TypeScript is a superset of JavaScript that compiles to clean JavaScript output. TypeScript 是 JavaScript 的一个超集&#xff0c;支持 EC…...

【循环测试试题2】小X与三次方

题目描述 卡卡西要过 10 岁生日啦&#xff01;今年&#xff0c;她特别想要一份与众不同的礼物&#xff0c;那就是一条能在阳光下发出五光十色耀眼光芒的水晶项链。她把这个想法告诉了妈妈。妈妈对卡卡西神秘的一笑&#xff0c;透露道&#xff1a;“邻居芭比阿姨家有个后花园。…...

【Python · PyTorch】卷积神经网络(基础概念)

【Python PyTorch】卷积神经网络 CNN&#xff08;基础概念&#xff09; 0. 生物学相似性1. 概念1.1 定义1.2 优势1.2.1 权重共享1.2.2 局部连接1.2.3 层次结构 1.3 结构1.4 数据预处理1.4.1 标签编码① One-Hot编码 / 独热编码② Word Embedding / 词嵌入 1.4.2 归一化① Min-…...

深入描述dts和dtsi的区别

QA&#xff1a;dts和dtsi的区别 在嵌入式 Linux 系统中&#xff0c;DTS&#xff08;Device Tree Source&#xff09;和 DTSI&#xff08;Device Tree Source Include&#xff09;是描述硬件设备树的文件格式。它们本质上是同一种语法的文件&#xff0c;但在使用上有一定区别。…...

京准时钟:一种北斗卫星校时器的结构设计

京准时钟&#xff1a;一种北斗卫星校时器的结构设计 京准时钟&#xff1a;一种北斗卫星校时器的结构设计 1、有关时间的一些基本概念&#xff1a; 时间与频率之间互为倒数关系&#xff0c;两者密不可分&#xff0c;时间标准的基础是频率标准&#xff0c;由晶体振荡器决定时间…...

【WiFi】ubuntu20.4 WiFi6 无线抓包环境搭建及使用

环境说明 笔记本电脑&#xff0c;无线网卡AX200&#xff0c;安装ubuntu20.04 安装无线网卡工具aircrack-ng sudo apt-get install aircrack-ng 安装wireshark sudo add-apt-repository ppa:wireshark-dev/stable sudo apt update sudo apt -y install wireshark sudo apt -…...

《Java核心技术 卷I》用户界面AWT事件继承层次

AWT事件继承层次 EventObject类有一个子类AWTEvent&#xff0c;它是所有AWT事件类的父类。 Swing组件会生成更多其他事件对象&#xff0c;都直接拓展自EventObject而不是AWTEvent。 AWT将事件分为底层(low-level)事件和语义事件。 语义事件&#xff1a;表示用户的动作事件&…...

蓝牙 HFP 协议详解及 Android 实现

文章目录 前言一、什么是蓝牙 HFP 协议&#xff1f;HFP 的核心功能HFP 的核心功能HFP 在 Android 中的典型应用场景 二、HFP 协议的工作流程HFP 的连接流程 三、HFP 在 Android 的实现1. 检查蓝牙适配器状态2. 发现并检测支持 HFP 的设备3. 获取 BluetoothHeadset 服务4. 连接设…...

sqli-labs靶场17-20关(每日四关)持续更新!!!

Less-17 打开靶场&#xff0c;发现页面比之前多了一行字 翻译过来就是&#xff0c;密码重置&#xff0c;大家肯定会想到&#xff0c;自己平时在日常生活中怎么密码重置&#xff0c;肯定是输入自己的用户名&#xff0c;输入旧密码&#xff0c;输入新密码就可以了&#xff0c;但…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...