Swift--基本运算符与程序流程控制

系列文章目录

第一章:量值与基本数据类型
第二章:字符、字符串与集合类型


文章目录

  • 系列文章目录
  • 空合并运算符
  • 区间运算符
  • 循环结构
    • while与repeat-while条件循环结构


空合并运算符

可选值类型是Swift语言的一个独特之处,空合并运算符就是针对可选值类型而设计的运算符


var q:Int? = 8
var value:Int
if q != nil {value = q!
} else {value = 0
}
var q:Int? = 8
var value:Int
value = (q != nil) ? (q!) : 0

Swift语言中还提供了空合并运算符来更加简洁地处理这种Optional类型值的条件选择结构,空合并运算符由“??”表示

空合并运算符“??”是一个二元运算符,使用空合并运算符改写后的代码更加简洁。其需要两个操作数,第一个操作数必须为一个Optional值,如果此Optional值不为nil,则将其进行拆包操作,并作为空合并运算的运算结果。如果此Optional值为nil,则会将第二个操作数作为空合并操作运算的结果返回。使用空合并操作符来处理有关Optional值的选择逻辑将十分方便

区间运算符


//表示大于0小于10的范围
index > 0 && index < 10
//创建范围>= 0 且<= 10的闭区间
var range1 = 0...10
//创建范围>= 0且<10的半开区间
var range2 = 0..<10//判断8是否在range1中
print(range1 ~= 8)

区间运算符常见于for-in循环结构中

//a...b为闭区间写法
for index in 0...3 {print(index)
}
//a..<b为左闭右开区间
for index in 0..<3 {print(index)
}

循环结构

for index in 1...5 {print(index)
}

for-in结构中需要两个参数,第2个参数可以是一个集合类型的实例,也可以是一个范围区间,第1个参数为捕获参数,每次从第2个参数中遍历出的元素便会赋值给它,开发者在循环结构中可以直接使用


var collection1:Array = [1, 2, 3, 4]
var collection2:Dictionary = [1:1, 2:2, 3:3, 4:4]
var collection3:Set = [1, 2, 3, 4]
for obj in collection1 {print(obj)
}
for (key, value) in collection2 {print(key, value)
}
for obj in collection3 {print(obj)
}

while与repeat-while条件循环结构

只是Swift语言将do-while结构修改为repeat-while

var i = 0
//当i不小于10的时候跳出循环
while i < 10 {print("while", i)//进行i的自增i = i + 1
}

在这里插入图片描述

var j = 0
//先执行一次循环体, 在判断循环条件是否成立
repeat {print("repat while")j = j + 1
} while j < 10
var c = 10
//进行if判断
if c < 10 {print(c)
}
//进行if-else组合
if c > 10 {c = c - 10print(c)
} else {print(c)
}
//进行if-else多分支组合
if c > 0 && c < 10 {print(c)
} else if c <= 10 {c = -cprint(c)
} else if c <= 10 && c < 20 {c = c - 10print(c)
} else {print("bigger")
}
var charac = "a"
switch charac {
case "a":print("chara is a")
case "b":print("chara is b")
case "c":print("chara is c")
default:print("no chara")
}

在C/Objective-C语言中,case语句不会因匹配成功而中断,如果不进行手动控制,switch结构中的case子句会依次进行匹配执行
switch-case结构也支持开发者在一个case子句中编写多个匹配条件,程序在执行到这个case子句时,只要有一个条件匹配成功,就会执行此case下的代码


var charac = "a"
switch charac {
case "a", "b", "c":print("chara is word")
case "1", "2", "3":print("chara is num")
default:print("no chara")
}

case子句的匹配条件也可以是一个区间范围,当要匹配的参数在这个区间范围内时,就会执行此case下的代码

var num = 3
switch num {
case 1...3:print("1 <= num <= 3")case 4:print("chara is num")
default:print("no charac")}

在进行元组的匹配时,有3种方式可以选择:第1种方式是完全匹配,即元组中所有元素都必须完全相等,才算匹配成功;第2种方式是选择匹配,即开发者只需要指定元组中的一些元素进行匹配,不需要关心的元素可以使用匿名参数标识符来代替,这种方式下,只要指定的参数都相等,就算匹配成功;第三种方式是范围匹配,即相应位置指定的范围包含需匹配元组相应位置的值,就算匹配成功。其中第2种匹配方式可以和第3种匹配方式组合使用。

var tuple = (0, 0)
switch tuple {
case(0, 1):print("sure")
case (_, 1):print("Sim")
case (0...3, 0...3):print("SIM")
default:print("")
}
var tuple = (0, 0)
//进行数据绑定
switch tuple {
case (let a, 1):print(a)
case (let b, 0):print(b)
case let(a, b):print(a, b)
default:print("")
}
//对于进行了数据捕获的Switch-case结构, 可以使用where关键字来进行条件判断
switch tuple {
case (let a, 1):print(a)
case (let b, 0) where b == 0:print(b)
case let(a, b) where a == b:print(a, b)
default:print("")
}
//对于进行了数据捕获的Switch-case的结构,可以使用where关键字来进行条件判断
switch tuple {
case (let a, 1):print(a)
case (let b, 0) where b == 0:print(b)
//当元祖中的两个元素相同时,才会进入下面的case
case let(a, b) where a == b:print(a, b)
default:print("")
}

for index in 0...9 {if index == 6 {continue}print("第几次循环")
}

上面的示例代码将跳过index等于6时的代码块,在打印信息中会缺少index等于6时的打印输出

MyLabel:for indexI in 0...2 {for indexJ in 0...2 {if indexI == 1 {continue MyLabel}print("第几次循环")}
}

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

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

相关文章

系列三、双亲委派机制

一、概述 当一个类收到了类加载的请求&#xff0c;它首先不会尝试自己去加载这个类&#xff0c;而是把这个请求委派给父类去完成&#xff0c;每一层的类加载器都是如此&#xff0c;因此所有的请求都应该传送到启动类加载器中&#xff0c;只有当父类加载器反馈自己无法完成这个…

Android 框架

MVC: MVP MVVM Model 数据以及业务数据 View 视图 Control 控制器 simple code MVP OnFinishInflate ViewGroup 加载完成 MVC 优化 Struts MVC- MVP MVC-单次调用逻辑把 MVP / 把C拆分出来 MVVM 2017Google推出ViewModel DataBind MVVM是一种框架规则,双向绑定 Model…

Spring-Spring之AOP底层源码解析(下)

ProxyFactory选择cglib或jdk动态代理原理 ProxyFactory在生成代理对象之前需要决定到底是使用JDK动态代理还是CGLIB技术&#xff1a; // config就是ProxyFactory对象// optimize为true,或proxyTargetClass为true,或用户没有给ProxyFactory对象添加interface if (config.isOpt…

爆款标题怎么出来的?媒介盒子揭秘产出技巧

用户点开一篇文案的主要因素取决于标题是否具有吸引力&#xff0c;直观判断可能只需要半秒钟&#xff0c;用户的操作也决定了文章的点击率与阅读完成率。 然而有许多人为了取标题想破脑袋也想不出来&#xff0c;甚至文案内容出来了标题还没出来&#xff0c;今天媒介盒子就来为…

货运代理开发信如何写?货代邮件标题推荐?

货运代理开发信怎么群发&#xff1f;货代编写外贸开发信的方法&#xff1f; 在竞争激烈的货运代理行业&#xff0c;如何撰写一封引人注目的开发信是至关重要的。蜂邮EDM将探讨如何撰写一封引人注目的货运代理开发信&#xff0c;以吸引目标受众并建立有利的业务关系。 货运代理…

微信小程序H5 uniapp

最近微信小程序对有视频播放的审核严&#xff0c;需要提供“文娱类资质”。而申请这个资质比较繁琐。所以我们在小程序上用web-view做跳转到H5&#xff0c;H5使用uniapp编写。这是小程序关于web-view文档说明。https://developers.weixin.qq.com/miniprogram/dev/component/web…

Linux共享内存

共享内存&#xff1a;进程直接访问共享内存&#xff0c;由使用者进行访问控制&#xff08;互斥等&#xff09; 使用ipcs命令查看系统共享内存 POSIX 共享内存 有名共享内存 多个进程通过共享内存的名字来获取同一块共享内存&#xff0c;实现共享 #include <stdio.h>…

基于Python实现连锁咖啡店经营情况EDA分析【500010097】

导入模块 import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.express as px获取数据 df pd.read_csv(r./data/coffeeshop.csv) data_exploration(df)数据缺失值情况 print(数据缺失值情况&#xff1a;) df.…

sqli-labs(Less-4) extractvalue闯关

extractvalue() - Xpath类型函数 1. 确认注入点如何闭合的方式 2. 爆出当前数据库的库名 http://127.0.0.1/sqlilabs/Less-4/?id1") and extractvalue(1,concat(~,(select database()))) --3. 爆出当前数据库的表名 http://127.0.0.1/sqlilabs/Less-4/?id1") …

API 集成测试工具Hitchhiker 0.1.1 正式发布

Hitchhiker 是一款开源的 Restful Api 集成测试工具&#xff0c;你可以在轻松部署到本地&#xff0c;和你的 team 成员一起管理 Api。 能做什么 * Team 协作开发 Api * Api 历史修改记录及支持 diff 展示 * 支持多环境变量及运行时变量 * 支持 Schedule 及批量 run * 不同…

【数据结构初阶】链表OJ

链表OJ 题目一&#xff1a;移除链表元素题目二&#xff1a;反转链表题目三&#xff1a;链表的中间节点题目四&#xff1a;链表中倒数第k个结点题目五&#xff1a;合并两个有序链表题目六&#xff1a;链表分割题目七&#xff1a;链表的回文结构题目八&#xff1a;相交链表题目九…

python实现双臂老虎机k-armed-bandit

老虎机&#xff0c;投入钱币会随机返还钱币&#xff08;reward&#xff09; 这里设置两台老虎机&#xff0c;一台均值500&#xff0c;标准差5&#xff0c;一台均值550&#xff0c;标准差10 初始值均为998&#xff0c;更新规则为reward之和/轮数 最后结果会在均值附近收敛 impo…