Swift中空合运算符、闭区间运算符、单侧区间、半开区间

空合运算符(Nil Coalescing Operator)

用于取代3目判空运算,提供超短的写法
比如常规判空写法如下,反正我写java就是这么干的

var anOptionalInt: Int? = 10var anInt: Int = 0if anOptionalInt != nil {
anInt = anOptionalInt!
}

 

空合运算符(a ?? b)将对可选类型 a 进行空判断,如果 a 包含一个值就进行解封,否则就返回一个默认值 b。表达式 a 必须是 Optional 类型。默认值 b 的类型必须要和 a 存储值的类型保持一致。

空合运算符是对以下代码的简短表达方法:

a != nil ? a! : b

 

上述代码使用了三元运算符。当可选类型 a 的值不为空时,进行强制解封(a!),访问 a 中的值;反之返回默认值 b。无疑空合运算符(??)提供了一种更为优雅的方式去封装条件判断和解封两种行为,显得简洁以及更具可读性。

下文例子采用空合运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:

let defaultColorName = "red"
var userDefinedColorName: String? //默认值为 nil

var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"

 

userDefinedColorName 变量被定义为一个可选的 String 类型,默认值为 nil。由于 userDefinedColorName 是一个可选类型,我们可以使用空合运算符去判断其值。在上一个例子中,通过空合运算符为一个名为 colorNameToUse 的变量赋予一个字符串类型初始值。 由于 userDefinedColorName 值为空,因此表达式 userDefinedColorName ?? defaultColorName 返回 defaultColorName 的值,即 red。

闭区间运算符


区间运算用于循环,闭区间意思是全部范围都需要,用于替代(i>=1 && i<=5)

for index in 1...5 {
print("\(index) * 5 = \(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
// 5 * 5 = 25

 

半开区间运算符


半开区间运算符(a..<b)定义一个从 a 到 b 但不包括 b 的区间。 之所以称为半开区间,是因为该区间包含第一个值而不包括最后的值。

半开区间的实用性在于当你使用一个从 0 开始的列表(如数组)时,非常方便地从0数到列表的长度。

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("第 \(i + 1) 个人叫 \(names[i])")
}
// 第 1 个人叫 Anna
// 第 2 个人叫 Alex
// 第 3 个人叫 Brian
// 第 4 个人叫 Jack

数组有 4 个元素,但 0..<count 只数到3(最后一个元素的下标),因为它是半开区间。

单侧区间

闭区间操作符有另一个表达形式,可以表达往一侧无限延伸的区间 —— 例如,一个包含了数组从索引 2 到结尾的所有值的区间。在这些情况下,你可以省略掉区间操作符一侧的值。这种区间叫做单侧区间,因为操作符只有一侧有值。例如:

for name in names[2...] {
print(name)
}
// Brian
// Jackfor name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian

 

半开区间操作符也有单侧表达形式,附带上它的最终值。就像你使用区间去包含一个值,最终值并不会落在区间内。例如:

for name in names[..<2] {
print(name)
}
// Anna
// Alex

 

转载于:https://www.cnblogs.com/starcrm/p/9961905.html

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

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

相关文章

关于禁止svn客户端长驻内存的方法

公司到目前为止版本控制多用svn&#xff0c;安装后会自动加载tsvncache.exe主程序&#xff0c;尝试手动关闭该进程&#xff0c;过几分钟又会再出现。 使用svn一段时间以来&#xff0c;发现该程序除了会自动加载&#xff0c;偶尔还会自动扫描磁盘空间&#xff0c;并且对于未标记…

国内MCU厂商也开始卷了

最近我大学老师准备做一个项目&#xff0c;需要用到STM32的芯片&#xff0c;然后我就帮忙着一起找&#xff0c;不找不知道&#xff0c;找了才知道这个东西真的是贵。然后我就看了GD32&#xff0c;不了解不知道&#xff0c;这个东西也是真的贵。然后我又去看的MM32&#xff0c;结…

c语言朋友,[原创]写给初学 c语言的朋友

C语言的教材有很多&#xff0c;但基本都没有本质上的区别。随便拿两本里面的内容都差不多。对于第一次学习编程的人来说&#xff0c;看教材会产生很多疑问&#xff0c;比如为什么a a 1;是正确的、什么时候用变量、在什么地方定义变量等等。继续深入学习后又会产生许多疑问&am…

Google Flash转换HTML5工具Swiffy测试版发布

Google今年六月推出的Flash转换HTML5工具已经从实验室转为测试版&#xff0c;并新增一个Flash Professional扩充模组&#xff0c;可以直接将档案储存为HTML5格式。一开始Swiffy仅以网站方式&#xff0c;让使用者上传Flash的.swf档案&#xff0c;支持Flash所使用的swf 8格式与Ac…

求字符串全排列的递归算法

求字符串全排列的递归算法 void permutation(char * p_str, char * p_begin) { if(!p_str || !p_begin) { return; } if(\0 *p_begin) { printf("%s\n", p_str); }else { char * p_ch; for(p_ch p_begin; *p_ch ! \0; p_ch) { char temp; /* Swap …

ssis 排程更新

昨天&#xff0c;在as裡面再次看看以前作的一個cube發現&#xff0c;數據竟然一點都沒變&#xff0c;不大對勁&#xff0c;因為這些數據我都已經刪掉了。同事說是我沒選雪花&#xff0c;星型。我想都不想就說&#xff0c;肯定不是哪個樣子&#xff0c;因為sql 2005根本就沒讓你…

Clipboard.js复制粘贴到剪贴板

来自他人参考链接&#xff1a;https://www.cnblogs.com/kevinCoder/p/6144376.html转载于:https://www.cnblogs.com/jiaqi1719/p/9962342.html

什么是MCU里应尽量遵循的寄存器谨慎赋值法?

有人觉得搞MCU是一件简单的事情&#xff0c;往往觉得简单的事反而出错更多&#xff0c;今天转发一篇我朋友痞子衡的文章&#xff0c;说说MCU里面的寄存器的事。大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是改动i.MXRT1xxx里IOMUXC_G…

惠普电脑如何下载c语言软件,惠普笔记本电脑上的语言栏怎么弄

满意答案mygood12f32013.01.23采纳率&#xff1a;53% 等级&#xff1a;11已帮助&#xff1a;6723人首先运行“regedit”&#xff0c;展开“HKEY_CURRENT_USER/keyboard layout/preload”分支&#xff0c;在其下新建一个字符串值&#xff0c;命名为“1”&#xff0c;并将它对…

学习C++/C的宏与for循环的结合

#define ABC(x) (((x) > 5 && (x) < 10) ? (x) : 0) for (int i 3; i < 13; i) { cout << "i " << i << ", "; cout << "ABC(i) " << ABC(i) << "\n"; } 结果是&#xf…

windows 7鼠标右键另存为没有桌面选项

问&#xff1a;Windows7 另存为没有桌面文件夹怎么办&#xff1f; 答&#xff1a;在另存为窗口的资源管理器左栏空白处单击鼠标右键&#xff0c;选中“显示所有文件夹”即可。

单件模式(Singleton Pattern)

1、单件模式试用与窗口管理器或者是打印假脱机、数据库连接池&#xff1b;2、目的&#xff1a;在单独得对象实例中&#xff0c;集中了这个对象所属类得所有权利&#xff1b;3、DoNet解决方案 public class DotNetSigleton { private static readonly DotNetSiglet…

LeetCode:二进制手表【401】

LeetCode&#xff1a;二进制手表【401】 题目描述 二进制手表顶部有 4 个 LED 代表小时&#xff08;0-11&#xff09;&#xff0c;底部的 6 个 LED 代表分钟&#xff08;0-59&#xff09;。 每个 LED 代表一个 0 或 1&#xff0c;最低位在右侧。 例如&#xff0c;上面的二进制手…

反馈电路中相位补偿,到底是什么鬼?

帮朋友做镍氢充电器&#xff0c;利用镍氢电池充满电时电压有一个微小的下降这个特点来识别是否已经充满&#xff0c;比如1.2V的镍氢电池&#xff0c;快充满的时候&#xff0c;电压在1.35V&#xff0c;之后逐步下降&#xff0c;电压可以低于1.30V。所以需要单片机间歇检测电池两…

HTTP代理协议 HTTP/1.1的CONNECT方法

我们平时使用HTTP协议无非就是GET、POST这些方法&#xff0c;但是HTTP的内容远不止那些。今天就来说说HTTP代理使用的CONNECT。这个不是在网页开发上用的&#xff0c;如果没兴趣就跳过吧。   APACHE只是作为网页的服务器被使用的&#xff0c;不会支持这个方法。如果要使用它必…

RoseHA集群:RHEL+RoseMirror+Oracle【2】

博主正在参加“2011年度IT博客大赛”&#xff0c;欢迎帮顶&#xff01; 投票地址 --------------------------------------------- 三&#xff0e;安装Rose Mirror HA&#xff1a;准备工作&#xff1a;在安装 Rose Mirror HA 前检查相应的软件包是否安装&#xff0c;如果没有安…

c语言笔试面试面试题,最新华为c语言笔试面试题

最新华为c语言笔试面试题本文是百分网小编搜索整理的一份最新华为c语言笔试面试题&#xff0c;有需要的朋友们一起看看吧!想了解更多相关信息请持续关注我们应届毕业生考试网!1、局部变量能否和全局变量重名答&#xff1a;能&#xff0c;局部会屏蔽全局。要用全局变量&#xff…

【项目管理】CMMI-需求跟踪矩阵模版

需求菜单/功能模块需求名称需求变更类型&#xff08;新增、修改&#xff09;需求状态&#xff08;已建议、已批准、已设计、已实现、已验证、已删除&#xff09;优先级&#xff08;高、中、低&#xff09;软件需求&#xff08;工作产品、章节号&#xff09;概要设计&#xff08…

嵌入式工程师薪资调查

大家好&#xff0c;嵌入式行业薪资一直是大家关心的问题&#xff0c;刚好我的好朋友发起了一个调查&#xff0c;大家可以匿名写下自己的薪资&#xff0c;也可以看看其他的薪资水平。3月4月份确实是找工作的好机会&#xff0c;求职和跳槽最好的月份要来了吗 &#xff0c;最近看到…

阴阳天

阴阳天——代腾飞 2006年8月5日 于成都成都天气多风云一半风雨一半晴风雨烈日皆独行叫我怎能不生情转载于:https://www.cnblogs.com/daitengfei/archive/2006/08/06/469413.html