Swift系列二 - 循环控制
一、if-else
- if后面的条件可以省略小括号
- 条件后面的大括号不可以省略
let age = 10
if age >= 18 {
print("大学")
} else if age >= 16 {
print("高中")
} else {
print("义务")
}
- if后面的条件只能是Bool类型
二、while
var num = 3
while num > 0 {
print("num is \(num)")
num -= 1
}
/*
输出:
num is 3
num is 2
num is 1
*/
- swift中没有
do-while
,相同逻辑的是repeat-while
- swift3开始,去除了自增(++),自减(--)运算符
- 不要再使用
num++
,num--
,++num
,--num
等运算符了 - 自增自减运算符在不同平台有不一样的效果,所以swift放弃了使用
- 不要再使用
var num = -1
repeat {
print("num is \(num)")
} while num > 0
/*
输出:num is -1
*/
三、for
3.1. 区间运算符
格式:a...b
(a <= 取值 <= b)
- 变量默认是let修饰,可以自己根据情况修改为var
// 常规用法
let words = ["aaa", "bbb", "ccc", "ddd"]
for i in words {
print(i);
}
/*
输出:
aaa
bbb
ccc
ddd
*/
// 区间用法
for i in 1...3 {
print(i, words[i])
}
/*
输出:
1 bbb
2 ccc
3 ddd
*/
// var修饰
for var i in 1...3 {
i += 5
print(i)
}
/*
输出:
6
7
8
*/
// 区间定义常量
let range = 1...3
for i in range {
print(i)
}
/*
输出:
1
2
3
*/
// 区间值自定义
let a = 1
let b = 3
for i in a...b {
print(i)
}
/*
输出:
1
2
3
*/
3.2. 半开区间运算符
格式:a..<b
(a <= 取值 < b)
for i in 1..<3 {
print(i)
}
/*
输出:
1
2
*/
3.3. 区间运算符用在数组上
// 此处只是示例用法,实际应用时应注意数组越界
let words = ["aaa", "bbb", "ccc", "ddd"]
for i in words[0...3] {
print(i);
}
3.4 单侧区间:让区间朝一个方向尽可能的远
// 常规闭区间
let words = ["aaa", "bbb", "ccc", "ddd"]
for word in words[0...3] {
// print(word);
}
/*
输出:
aaa
bbb
ccc
ddd
*/
// 左边代表开始,右边代表数组最大长度
for word in words[2...] {
print(word)
}
/*
输出:
ccc
ddd
*/
// 左边代表0,右边闭区间值
for word in words[...2] {
print(word)
}
/*
输出:
aaa
bbb
ccc
*/
// 左边代表0,右边<2
for word in words[..<2] {
print(word)
}
/*
输出:
aaa
bbb
*/
// 无限制,range左边是无穷小的整数
let range = ...5
print(range.contains(7)) // false
print(range.contains(1)) // true
print(range.contains(-2)) // true
四、区间类型(Range)
- 范围代表的是两个值的区间,它由上下边界进行定义;
- 不能对 Range 或者 ClosedRange 进行迭代,但是我们可以检查某个元素是否存在于范围中;
- Range 和 ClosedRange 既非序列,也不是集合类型。有一部分范围确实是序列是因为 0..<10 的类型其实是一个 CountableRang。CountableRange 和 Range 很相似,只不过它还需要一个附加约束:它的元素类型需要遵守 Strideable 协议 (以整数为步⻓)。Swift 将这类功能更强的范围叫做可数范围,这是因为只有这 类范围可以被迭代。可数范围的边界可以是整数或者指针类型,但不能是浮点数类型,这是由 于 Stride 类型中有一个整数的约束。如果你想要对连续的浮点数值进行迭代的话,你可以通过 使用 stride(from:to:by) 和 stride(from:through:by) 方法来创建序列用以迭代。
-- | 半开 | 闭合 |
---|---|---|
Comparable | Range | ClosedRange |
Strideable(以整数为步长) | CountableRange | CountableClosedRange |
4.1. 同时省略掉上、下两个边界,这样你将会得到整个集合类型的切片
let arr = [1,2,3,4]
arr[...] // [1, 2, 3, 4]
type(of: arr) // Array<Int>
// 半开区间
let rang: Range = 0.0..<1.0
let countableRange: CountableRange = 0..<1
// 闭区间
let closedRange: ClosedRange = 0.0...1.0
let countableClosedRange: CountableClosedRange = 0...1
// 右侧闭区间
let partialRangeThrough: PartialRangeThrough = ...1.0
// 左侧闭区间
let partialRangeFrom: PartialRangeFrom = 0.0...
// 右侧开区间
let partialRangeUpTo: PartialRangeUpTo = ..<1.0
// 左侧闭区间
let countablePartialRangeFrom: CountablePartialRangeFrom = 1...
4.2. 字符、字符串也能使用区间运算符,但默认不能用在for-in中
let stringRange1 = "cc"..."ff"
stringRange1.contains("cb") // false
stringRange1.contains("dz") // true
stringRange1.contains("e") // true
stringRange1.contains("fg") // false
let stringRange2 = "a"..."f"
stringRange2.contains("a") // true
stringRange2.contains("e") // true
stringRange2.contains("g") // false
// \0到~囊括了所有可能要用到的ASCII字符
let characterRange: ClosedRange<Character> = "\0"..."~"
characterRange.contains("G") // true
4.3 带间隔的区间值
let startValue = 0
let endValue = 10
let interval = 2
// value取值从startValue开始,每次间隔interval,不超过endValue
for value in stride(from: startValue, through: endValue, by: interval) {
print(value)
}
/*
输出:
0
2
4
6
8
10
*/
// 另外一个方法 to是开区间
public func stride<T>(from start: T, to end: T, by stride: T.Stride) -> StrideTo<T> where T : Strideable
五、switch
5.1. case、default后面不能写大括号(编译器会报错)
5.2. 默认情况下可以不写break,并不会贯穿到后面的条件
enum HeaderCode {case success, failure, redirect, connect}
let code = HeaderCode.success
switch code {
case .success:
print("success")
case .redirect:
print("redirect")
case .connect:
print("connect")
default:
print("failure")
}
/*
输出:success
*/
5.3. 如果需要贯穿,怎么办?fallthrough
enum HeaderCode {case success, failure, redirect, connect}
let code = HeaderCode.success
switch code {
case .success:
print("success")
fallthrough
case .redirect:
print("redirect")
case .connect:
print("connect")
default:
print("failure")
}
/*
输出:
success
redirect
*/
5.4. case、default后面至少要有一条语句
5.5. switch必须要保证能处理所有情况
- 如果不想做任何事,加个break即可
- 如果能保证已处理所有情况,也可以不使用default
enum HeaderCode {case success, failure, redirect, connect}
let code = HeaderCode.success
switch code {
case .success:
break
case .redirect:
print("redirect")
case .connect:
print("connect")
case .failure:
print("failure")
}
5.6. 复合条件(switch支持Character、String类型)
// String
let string = "idbeny"
switch string {
case "idbeny":
print("idbeny")
fallthrough
case "developer":
print("developer")
default:
print("man")
}
/*
输出:
idbeny
developer
*/
// Character
let character: Character = "a"
switch character {
case "a", "A":
print("aaa")
default:
print("not found")
}
/*
输出:aaa
*/
5.7. 区间匹配、元组匹配
// 区间匹配
let count = 10
switch count {
case 0:
print("zero")
case 1...5:
print("few")
case 10...100:
print("large")
default:
print("not found")
}
/*
输出:large
*/
// 元组匹配
let point = (1, 1)
switch point {
case (0, 0):
print("origin")
case (_, 0):
print("x-axis")
case (0, _):
print("y-axis")
case (-2...2, -2...2):
print("in the box")
default:
print("not found")
}
/*
输出:in the box
*/
- 可以用下划线(
_
)忽略某个值 - 值绑定(必要时let可以改为var)
let point1 = (2, 0)
switch point1 {
case (let x, 0):
print("on the x-axis and x value of \(x)")
case (0, let y):
print("on the y-axis and y value of \(y)")
case (let x, let y):
print("at (\(x), \(y))")
}
/*
输出:on the x-axis and x value of 2
*/
六、where(过滤)
let point = (1, -1)
switch point {
case let(x, y) where x == y:
print("x == y")
case let(x, y) where x == -y:
print("x == -y")
case let(x, y):
print("at (\(x), \(y))")
}
/*
输出:x == -y
*/
// 把所有数加起来
var numbers = [10, 20, -30, -40, 50]
var sum = 0
for num in numbers where num > 0 {
sum += num
}
print(sum)
/*
输出:80
*/
七、标签语句
side: for i in 1...4 {
for k in 1...4 {
if k == 3 {
continue side
}
if i == 3 {
break side
}
print("i == \(i), k == \(k)")
}
}
/*
输出:
i == 1, k == 1
i == 1, k == 2
i == 2, k == 1
i == 2, k == 2
*/
Swift系列二 - 循环控制的更多相关文章
- 窥探Swift系列博客说明及其Swift版本间更新
Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能.到目前为止,Swift为2.1版本.去年翻译的Swift ...
- C#基础总结之二循环控制-运算符
#region 第二天 作业2 从键盘上输入三个数,用if语句和逻辑表达式把最小数找出来. //需要:控制台输入 三个变量(a,b,c)判断这三个数其中一个最小的值 打印输出 //Console.Wr ...
- 前端构建大法 Gulp 系列 (二):为什么选择gulp
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- Web 开发人员和设计师必读文章推荐【系列二十九】
<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十七】
<Web 前端开发精华文章推荐>2014年第6期(总第27期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发人员和设计师必读精华文章【系列二十六】
<Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】
<Web 前端开发精华文章推荐>2014年第2期(总第23期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- Tomcat8弱口令+后台getshell
漏洞原因 用户权限在conf/tomcat-users.xml文件中配置: <?xml version="1.0" encoding="UTF-8"?&g ...
- Nebula Storage 2.0 存储格式
随着 2.0 各版本的陆续发布,Nebula Graph 迎来了一系列的改动,在存储方面,影响最大的改动就是底层编码格式进行了修改.Nebula Graph 的底层存储是基于 KV 保存在 Rocks ...
- 记一次scrapy-redis爬取小说网的分布式搭建过程
scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征: 分布式爬取 可以启动多个spider工程,相 ...
- JVM之基础概念(运行时数据区域、TLAB、逃逸分析、分层编译)
运行时数据区域 JDK8 之前的内存布局 JDK8 之后的 JVM 内存布局 JDK8 之前,Hotspot 中方法区的实现是永久代(Perm),JDK8 开始使用元空间(Metaspace),以前永 ...
- 策略枚举:消除在项目里大批量使用if-else的正确姿势
文/朱季谦 想起刚开始接触JAVA编程的时候,若遇到大量流程判断语句,几乎满屏都是if-else语句,多得让自己都忘了哪里是头,哪里是尾,但是,纵然满屏是if-else,但彼时也没有觉得多别扭.等到编 ...
- Vue3教程:Vue 3 + Element Plus + Vite 2 的后台管理系统开源啦
之前发布过一篇文章<Vue3教程:开发一个 Vue 3 + element-plus 的后台管理系统>,文中提到会开发并开源一个 Vue 3 + Element Plus 的项目供大家练手 ...
- [递推]B. 【例题2】奇怪汉诺塔
B . [ 例 题 2 ] 奇 怪 汉 诺 塔 B. [例题2]奇怪汉诺塔 B.[例题2]奇怪汉诺塔 题目描述 汉诺塔问题,条件如下: 这里有 A A A. B B B. C C C 和 D D D ...
- OOUML系列总结及终章回顾
盼望着,盼望着,OO课程终于结束了,但是,此刻的我却感到一丝失落,甚至想着再来一单元岂不妙哉? 目录 总结本单元三次作业架构 四个单元中架构设计及OO方法理解的演进 四个单元中测试理解与实践的演进 课 ...
- pandas(5):数学统计——描述性统计
Pandas 可以对 Series 与 DataFrame 进行快速的描述性统计,方便快速了解数据的集中趋势和分布差异.源Excel文件descriptive_statistics.xlsx: 一.描 ...
- Window下Python+CUDA+PyTorch安装
1 概述 Windows下Python+CUDA+PyTorch安装,步骤都很详细,特此记录下来,帮助读者少走弯路. 2 Python Python的安装还是比较简单的,从官网下载exe安装包即可: ...