iOS开发Swift-元组类型和流程控制
—、元组类型
1.什么是元组类型
元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素”
示例:
let position = (x : 10.5, y : 20) // position有2个元素,x、y是元素的名称
let person = (name : "jack") // person只有name一个元素
let data = () // 空的元组
2.元素的访问
var position = (x : 10.5, y : 20)
(1)用元素名称
let value = position.x // 取值
position.y = 50 // 设值
(2)用元素位置
var value = position.0 // 相当于var value = postion.x
position.1 = 50 // 相当于postion.y = 50
代码示例:
注意:如果用let来定义一个元组,那么就是常量,就无法修改它的元素
let point = (x : 10, y : 20)
point.x = 30
第2行代码会报错
代码示例:
3.元组的输出
可以输出整个元组来查看所有元素的值
var point = (x : 10.5, y : 20)
point.x = 30
point.1 = 50
println(point)
输出结果是:(30.0, 50)
二、使用细节
(1)可以省略元素名称
let position = (10, 20)
let person = (20, "jack")
(2)可以明确指定元素的类型
var person: (Int, String) = (23, "rose")
person的第0个元素只能是Int类型、第1个元素只能是String类型
注意:在明确指定元素类型的情况下不能加上元素名称
因此,下面的语句是错误的
var person: (Int, String) = (age : 23, name : "rose")
(3)可以用多个变量接收元组数据
var (x , y) = (10, 20) // x是10,y是20
var point = (x, y) // point由2个元素组成,分别是10和20
(4)可以将元素分别赋值给多个变量
var point = (10, 20)
var (x , y) = point
// x是10,y是20
(5)可以使用下划线 _ 忽略某个元素的值,取出其他元素的值
var person = (20, "jack")
var (_, name) = person
// name的内容是“jack”,person中的元素20被忽略
三、swift中的流程控制
Swift支持的流程结构如下:
循环结构:for、for-in、while、do-while
选择结构:if、switch
注意:这些语句后面一定要跟上大括号{},在C语言中不是必须的
说明:跟C语言对比,用法基本一样的有:for、while、do-while、if
因此,只需要关注for-in和switch即可
四、for-in结构
简单使用:
for-in和范围运算符
for i in 1...3 {
println(i)
}
// 按顺序从范围中取值赋值给i,每取1次值,就执行1次循环体
// 范围的长度就是循环体执行的次数
代码示例:
提示:如果不需要用到范围中的值,可以使用下划线 _ 进行忽略
for _ in 1...3 {
println("*********")
}
代码示例:
注意:i为常量,其值是不能改变的。
五、switch的使用
1.使用示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
let grade = "B" switch grade { case "A": println("优秀等级") case "B": println("良好等级") case "C": println("中等等级") default: println("未知等级") }
2.switch语句在 Swift 和 C 中的区别:
在C语言中,如果case的结尾没有break,就会接着执行下一个case或者default语句
在Swift中,不需要在每一个case后面增加break,执行完case对应的代码后默认会自动退出switch语句
3.switch的注意点
在Swift中,每一个case后面必须有可以执行的语句
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
let grade = "B” switch grade { case "A": case "B": println("良好等级") default: println("未知等级") }
说明:第二行代码会报错
4.case的多条件匹配
1个case后面可以填写多个匹配条件,条件之间用逗号,隔开
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
let grade = "B” switch grade { case "A": case "B": println("良好等级") default: println("未知等级") }
5.case的范围匹配
case后面可以填写一个范围作为匹配条件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
let score = 95 switch score/10 { case 10, 9: println("优秀") case 8, 7, 6: println("及格") default: println("不及格") } // 打印结果是:优秀
注意:
switch要保证处理所有可能的情况,不然编译器直接报错
因此,这里的default一定要加,不然就出现了一些处理不到的情况
6.case匹配元组
case还可以用来匹配元组。比如判断一个点是否在右图的蓝色矩形框内
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
let point = (1, 1) switch point { case (0, 0) : println("这个点在原点上") case (_, 0) : println("这个点在x轴上") case (0, _) : println("这个点在y轴上") case (-2...2, -2...2) : println("这个点在矩形框内") default: println("这个点在其他位置") }
第5行中 _ 的作用(2种理解方式)
(1)能匹配任何值
(2)忽略对应位置元组元素
7.case的数值绑定
在case匹配的同时,可以将switch中的值绑定给一个特定的常量或者变量,以便在case后面的语句中使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
let point = (10, 0) switch point { case (let x, 0) : println("这个点在x轴上, x值是\(x)") case (0, let y) : println("这个点在y轴上, y值是\(y)") case let (x, y) : println("这个点的x值是\(x), y值是\(y)") } // 打印:这个点在x轴上, x值是10
8.where
switch语句可以使用where来增加判断的条件。比如判断一个点是否在右图的绿线或者紫线上
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var point = (10, -10) switch point { case let (x, y) where x == y : println("这个点在绿线上") case let (x, y) where x == -y : println("这个点在紫线上") default : println("这个点不在这2条线上") } // 打印:这个点在紫线上
9.fallthrough的作用
执行完当前case后,会接着执行fallthrough后面的case或者default语句
注意:fallthrough后面的case条件不能定义变量和常量
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
let num = 20 var str = "\(num)是个" switch num { case 0...50 : str += "0~50之间的" fallthrough default : str += "整数" } println(str) // 打印:20是个0~50之间的整数
10.标签
使用标签的其中1个作用:可以用于明确指定要退出哪个循环
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 做2组俯卧撑,每组3个,做完一组就休息一会 group : for _ in 1...2 { for item in 1...3 { println("做1个俯卧撑") if item == 2 { break group } } println("休息一会") }
输出结果是
做1个俯卧撑
做1个俯卧撑
代码示例: