Swift - 流程控制

文章目录

  • Swift - 流程控制
    • if-else
    • 2. while
    • 3. for
      • 3.1 闭区间运算符
      • 3.2 半开区间运算符
      • 3.3 for - 区间运算符用在数组上
        • 3.3.1 单侧区间
      • 3.4 区间类型
      • 3.5 带间隔的区间值
    • 4. switch
      • 4.1 fallthrough
      • 4.2 switch注意点
    • 5. 复合条件
    • 6. 区间匹配、元组匹配
    • 7. 值绑定
    • 8. where
    • 9. 标签语句

Swift - 流程控制

if-else

  • if后面的条件可以省略小括号
  • 条件后面的大括号不可以省略
let age = 4
if age >= 22 {print("Get married")
} else if age >= 18 {print("Being a adult")
} else if age >= 7 {print("Go to school")
} else {print("Just a child")
}

  • if后面的条件只能是Bool类型

2. while

  • repeat-while相当于C语言中的do-while
  • 这里不用num–,是因为
    • Swift3开始,去除了自增(++)、自减(--)运算符
var num1 = 5
while num1 > 0 {print("num is \(num1)")num1 -= 1
} //打印了5次var num2 = -1
repeat {print("num is \(num2)")
} while (num2 > 0) //打印了1次

3. for

3.1 闭区间运算符

a…b,a <= 取值 <= b

遍历一个闭区间:

let names = ["Anna", "Alex", "Brian", 
"Jack"]
for i in 0...3 {print(names[i])
} // Anna Alex Brian Jack

闭区间赋值给一个常量

let range = 1...3
for i in range {print(names[i])
} // Alex Brian Jack

使用变量表示区间的开头、结果

let a = 1
let b = 2
for i in a...b {print(names[i])
} // Brian Jackfor i in a...3 {print(names[i])
} // Alex Brian Jack

i默认是let,有需要是可以声明为var

for var i in 1...3 {i += 5print(i)
} //6 7 8

没有用到i,建议写个下划线_

for _ in 1...3 {print("123")
}

3.2 半开区间运算符

a…<b,a <= 取值 < b

// 半开区间运算符
for i in 1..<5 {print(i)
} // 1 2 3 4

3.3 for - 区间运算符用在数组上

// for - 区间运算符用在数组上
for name in names[0...3] {print(name)
} // Anna Alex Brian Jack
3.3.1 单侧区间

单侧区间:让区间朝一个方向尽可能的远

// 单侧区间:让区间朝一个方向尽可能的远
for name in names[2...] {print(name)
} // Brian Jackfor name in names[...2] {print(name)
} // Anna Alex Brianfor name in names[..<2] {print(name)
} // Anna Alex

查看区间是否包含

// 查看区间是否包含
let range2 = ...5
range2.contains(7) // false
range2.contains(4) // true
range2.contains(-3) // true

3.4 区间类型

前面写的区间并没有写类型,编译器自动推断类型了。

区间类型

// 区间类型
let range1: ClosedRange<Int> = 1...3
let range2: Range<Int> = 1..<3
let range3: PartialRangeThrough<Int> = ...5

字符、字符串也能使用区间运算符,但默认不能用在for-in中

// 字符、字符串也能使用区间运算符,但默认不能用在for-in中
let stringRange1 = "cc"..."ff" // ClosedRange<String>
stringRange1.contains("cb") // false
stringRange1.contains("dz") // true
stringRange1.contains("fg") //falselet stringRange2 = "a"..."f"
stringRange2.contains("d") // true
stringRange2.contains("h") //false

写明类型ClosedRange<Character>

//\0到~囊括了所有可能要用到的ASCII字符
let characterRange: ClosedRange<Character> = "\0"..."~"
characterRange.contains("G") //true

3.5 带间隔的区间值

// 带间隔的区间值
let hours = 11
let hourInterval = 2
// tickMark的取值:从4开始,累加2,不超过11
for tickMark in stride(from: 4, through: hours, by: hourInterval) {print(tickMark)
} // 4 6 8 10

4. switch

case、default后面不能写大括号{}

var number = 1
switch number {
case 1:print("number is 1")break
case 2:print("number is 2")break
default:print("number is other")break
} // number is 1

默认可以不写break,并不会贯穿到后面的条件

var number = 1
switch number {
case 1:print("number is 1")
case 2:print("number is 2")
default:print("number is other")
} // number is 1

4.1 fallthrough

使用fallthrough可以实现贯穿效果

// fallthrough 实现贯穿
var number = 1
switch number {
case 1:print("number is 1")fallthrough
case 2:print("number is 2")
default:print("number is other")
} // number is 1   // number is 2

4.2 switch注意点

switch必须要保证能处理所有情况

casedefault后面至少要有一条语

如果不想做任何事,加个break即可

如果能保证已处理所有情况,也可以不必使用default

// 如果能保证已处理`所有`情况,也可以不必使用
enum Answer { case right, wrong}
let answer = Answer.right
switch answer {
case Answer.right:print("right")
case Answer.wrong:print("wrong")
}

由于已确定answer是Ansewer类型,因此可以省略Answer

// 由于已确定answer是Ansewer类型,因此可以省略Answer
switch answer {
case .right:print("right")
case .wrong:print("wrong")
}

5. 复合条件

  • switch也支持Character、String类型

实现复合条件

这样写汇报case至少需要一条语句,需要写个fallthrough

// switch也支持Character、String类型
let string = "Jack"
switch string {
case "Jack":fallthrough
case "Rose":print("Right person")
default:break
}

也可以使用,实现复合条件

switch string {
case "Jack", "Rose":print("Right person")
default:break
}

Character

let character: Character = "a"
switch character {
case "a", "A":print("The letter A")
default:break
}

6. 区间匹配、元组匹配

区间匹配

let count = 62
switch count {
case 0:print("none")
case 1..<5:print("a few")
case 5..<12:print("several")
case 12..<100:print("dozens of")
case 100..<1000:print("hundreds of")
default:print("many")
} // dozens of

元组匹配(坐标系)

// 元组匹配(坐标系)
let point = (1, 1)
switch point {
case (0, 0):print("the origin")
case (_, 0):print("on the y-axis")
case (0, _):print("on the y-axis")
case (-2...2, -2...2):print("inside the box")
default:print("outside of the box")
} // inside the box

可以使用下划线 _ 忽略某个值

关于case匹配问题,属于模式匹配(Pattern Matching)的范畴,以后会再次详细展开讲解

7. 值绑定

let point = (2, 0)
switch point {
case (let x, 0):print("on the x-axis with an x value of \(x)")
case (0, let y):print("on the y-asix with a y value of \(y)")
case let (x, y):print("somewhere else at \(x), \(y)")
} // on the x-axis with an x value of 2

必要时let也可以改为var

8. where

坐标

// 坐标
let point3 = (1, -1)
switch point3 {
case let (x, y) where x == y:print("on the line x == y")
case let (x, y) where x == -y:print("on the line x == -y")
case let (x, y):print("(\(x), \(y)) is just some arbitrary point")
} // on the line x == -y

将所有正数加起来

// 将所有正数加起来
var numbers = [10, 20, -10, -20, 30, -30]
var sum = 0
for num in numbers where num > 0 {sum += num
}
print(sum) // 60

9. 标签语句

如下代码,正常情况我们在for k in里面使用continuebreak,针对的是for k in这个循环,这里我们使用标签语句,实现在for k in里面控制for i in这一层循环

outer: for i in 1...4 {for k in 1...4 {if k == 3 {continue outer}if i == 3 {break outer}print("i == \(i), k == \(k)")}
}
/* 打印内容i == 1, k == 1i == 1, k == 2i == 2, k == 1i == 2, k == 2*/

@oubijiexi

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

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

相关文章

【C语言】编译与链接

1.翻译环境与运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 1.翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令&#xff08;二进制指令&#xff09; 2.执行环境&#xff0c;它用于实际执行代码 2.翻译环境 那么翻译环境是怎么将源代码…

Java:七大基于比较的排序算法——上(思想+代码实现 超详细!)

冒泡排序、堆排序、插入排序、归并排序、快速排序、选择排序、希尔排序 目录 一、冒泡排序 1、基本思想 2、特征总结 3、代码实现 二、堆排序 1、基本思想 2、特征总结 3、代码实现 三、插入排序 1、基本思想 2、特征总结 3、代码实现 四、选择排序 1、基本思想 …

带宽的理解-笔记

带宽的理解 带宽(频带宽度)&#xff1a;是指电磁波最高频率和最低频率的差值&#xff0c;这一段频率被称为带宽。 举例说明 人耳能听到的频率范围是20赫兹到2万赫兹。换句话说&#xff0c;人而只对20赫兹至2万赫兹的声音频率有反应&#xff0c;超出或低于这一频率范围的声音我…

上市企业数字赋能指数数据集-2001到2022年(TF-IDF)

01、数据简介 上市公司数字赋能指数是一个用来衡量上市公司利用数字技术提高业务能力和效率的指标。这个指数反映了上市公司利用大数据、云计算和人工智能等数字技术&#xff0c;高效地利用商业资源和信息&#xff0c;并扩展供应关系的能力。市公司数字赋能指数是一种综合性的…

小米汽车充电枪继电器信号

继电器型号&#xff1a; 参考链接 小米SU7&#xff0c;便捷充放电枪拆解 (qq.com)https://mp.weixin.qq.com/s?__bizMzU5ODA2NDg4OQ&mid2247486086&idx1&sn0dd4e7c9f7c72d10ea1c9f506faabfcc&chksmfe48a110c93f2806f6e000f6dc6b67569f6e504220bec14654ccce7d…

基于Spring Boot的家具销售电商平台设计与实现

基于Spring Boot的家具销售电商平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

PDF 正确指定页码后,挂载的书签页码对不上

这个问题与我的另一篇中方法一样 如何让一个大几千页的打开巨慢的 PDF 秒开-CSDN博客 https://blog.csdn.net/u013669912/article/details/138166922 另作一篇的原因 一篇文章附带一个与该文章主题不相关的问题时&#xff0c;不利于被遇到该问题的人快速搜索发现以解决其遇到…

JavaScript基础(二)

JS语法结构——引入方式 js很明显可以是一个后缀名为js的文件&#xff0c;js的引入方式和css一样&#xff0c;也有三种方式。 1.外部 使用script表现&#xff0c;只不过增加一个src属性&#xff0c;把js文件的路径src属性中。 <script src "js文件路径">&l…

查看笔记本电池容量/健康状态

1. 打开命令行提示符 快捷键“win R”后输入“cmd” 2. 在命令提示符中输入命令 “powercfg /batteryreport" 并回车 3. 查看文件 最后就可以看到笔记本的电池使用报告了

[华为OD] C卷 5G网络 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站 200

题目 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N,接 下来需要各个基站之间使用光纤进行连接以确保基站能互联互通&#xff0c;不同基站之间架设光纤的成 本各不相同&#xff0c;且有些节点之间已经存在光纤相连&#…

mongodb使用debezium

前置 服务器上需要安装jdk11 jdk下载地址 kafka安装 官网下载地址 安装教程 debezium 安装 运行 Debezium 连接器需要 Java 11 或更高版本 Debezium 并不是一个独立的软件&#xff0c;而是很多个 Kafka 连接器的总称。这些 Kafka 连接器分别对应不同的数据库&#xff0c;…

十一、大模型-Semantic Kernel与 LangChain 的对比

Semantic Kernel 与 LangChain 的对比 Semantic Kernel 和 LangChain 都是用于开发基于大型语言模型&#xff08;LLM&#xff09;的应用程序的框架&#xff0c;但它们各有特点和优势。 基本概念和目标 Semantic Kernel 是一个由微软开发的轻量级 SDK&#xff0c;旨在帮助开发…

uniapp 自定义 App启动图

由于uniapp默认的启动界面太过普通 所以需要自定义个启动图 普通的图片不可以过不了苹果的审核 所以使用storyboard启动图 生成 storyboard 的网站&#xff1a;初雪云-提供一站式App上传发布解决方案

短视频素材哪个App最好?短视频素材哪里有免费的?

在数字媒体的黄金时代&#xff0c;富有创意的视频内容已成为吸引观众的关键。高质量的视频素材不仅能增强视觉效果&#xff0c;还能提升整体叙述的力度。以下列出了一系列全球顶尖的视频素材提供网站&#xff0c;它们将为你的广告制作、社交媒体或任何视频项目提供极具影响力的…

C++浮点数format时的舍入问题

C浮点数format时的舍入问题 首先有这样一段代码&#xff1a; #include <iostream> #include <stdio.h> using namespace std;int main() {cout << " main begin : " << endl;printf("%.0f \r\n", 1.5);printf("%.0f \r\n&…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统&#xff0c;支持各种编程语言和工具。 Jenkins是一款开…

ROM修改进阶教程------如何去除安卓机型系统的开机向导 几种操作步骤解析

在和很多工作室定制化系统中。手机在第一次启动的时候系统都会进入设置向导,虽然可以设置手机的基本配置。但有很多客户需要去除手机的开机向导来缩短开机时间。确保手机直接进入工作状态。那么今天的教程针去除对开机向导的几种方法做个解析。机型很多版本不同。操作也有不同…

ENVI下遥感积雪面积信息的提取

积雪是气温、降水变化的最敏感的指示因子之一&#xff0c;ENVI为积雪面积信息的提取提供了多种技术方法 光谱统计学方法 光谱统计学提取积雪面积信息主要利用感兴趣区域ROI&#xff08;样本&#xff09;的选择&#xff0c;利用传统的监督方法实现。 决策树方法 决策树方法提取…

《HCIP-openEuler实验指导手册》1.7 Apache虚拟主机配置

知识点 配置步骤 需求 域名访问目录test1.com/home/source/test1test2.com/home/source/test2test3.com/home/source/test3 创建配置文件 touch /etc/httpd/conf.d/vhost.conf vim /etc/httpd/conf.d/vhost.conf文件内容如下 <VirtualHost *.81> ServerName test1.c…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…