一、for循环
-
for-in
循环,遍历集合里面的每个元素:
// 遍历的元素是1到3的数字
for index in 1...3 { // index是每次循环开始时自动赋值,而且也不用声明
print(index);
}
输出结果: 1 2 3
当不需要区间序列内的值,可以用_
来忽略对值的访问:
int sum = 0;
for _ in 1...3 {
sum += 1;
print(sum);
}
输出结果: 3
遍历一个数组的所有元素:
let names = ["张三","李四","王五"];
for name in names {
print(name);
}
输出结果:
张三
李四
王五
遍历一个字典来访问它的键值对。遍历时,字典每项元素会以(key,value)
元组形式返回:
let dict = ["name":"swift", "age":"2", "version":"3.0"];
for (key,value) in dict {
print("\\\\(key):\\\\(value)");
}
输出结果:
version:3.0
age:2
name:swift
(备注:字典遍历顺序和插入顺序不同,是因为字典内部是无序的)
-
for
循环,使用条件判断和递增方法,标准C样式for
循环:
// 这之后index++将会被swift移除,所以循环更多选择for-in
for var index=0; index<3; index++ {
print("index:\\\\(index)");
}
输出结果:
index:0
index:1
index:2
<br />
二、while循环
-
while
循环,每次在循环开始时,进行条件判断是否符合:
var index = 3;
while index > 0 { // 先判断再执行
index -= 1;
print(index);
}
输出结果: 2 1 0
-
repeat-while
循环,每次在循环结束时,进行条件判断是否符合:
``` swift`
var index = 3;
repeat {
index -= 1;
print(index);
} while index > 0; // 先执行,再进行判断
输出结果: 2 1 0
<br />
#三、条件语句
---
swift提供了两种条件语句:`if`和`switch`。一般,但条件较为简单且可能的情况较少时,使用`if`语句。而`switch`更适合用于条件较复杂、可能情况较多、需要用到匹配`(pattern-matching)`的情况。
- `if`语句,当且仅当条件为`true`时,才执行相关代码:
```swfit`
let age = 23;
if age >= 18 { // 符合条件
print("已成年...");
} else { // 否则,即不符合条件
print("未成年的小屁孩...");
}
输出结果: 已成年...
-
switch
语句会尝试把某个值与若干个模式(pattern
)进行匹配,匹配成功则执行对应的代码:
let someCharacter: Character = "e"
switch someCharacter {
case "a", "e", "i", "o", "u":
print("\\\\(someCharacter)是元音”);
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
print("\\\\(someCharacter)是辅音”);
default: // 默认分支,处理其他情况的
print("\\\\(someCharacter)即不是元音也不是辅音”);
}
输出结果: "e是元音”
(注:在swift中,case
分支最后break
不是必须的。当匹配的case
分支中代码执行完毕后,程序会终止switch
语句,即不会继续执行下一个case
分支。)
-
switch
的区间模式。case
分支的模式可以是一个值区间:
``` swfit`
let num = 999;
switch num {
case 0...9:
print("一位数");
case 10..<100:
print("两位数");
case 100..<1000:
print("三位数");
case 1000...9999:
print("四位数");
default :
print("其他");
}
// 输出结果: 三位数
- `switch`的元组模式。`case`分支的模式可以是元组,元组中的元素可以是值,也可以是区间,另外,使用下划线`_`可以匹配所有可能的值:
``` swfit`
// 以0,0为中心点,4*4的矩形,确定点的位置
let point = (0,1);
switch point {
case (0, 0):
print("坐标原点");
case (_, 0): // _ 匹配所有可能值
print("在x轴上");
case (0, _):
print("在y轴上");
case (-2...2, -2...2):
print("在矩形内");
default:
print("在矩形外");
}
// 输出结果: 在y轴上
-
switch
的值绑定Value Bindings
模式。case
分支的模式允许将匹配的值绑定到一个临时的常量或变量,而这常量或变量在该case
分支中就可以被引用---这种行为就成为值绑定(Value Bindings)。
// 判断点是否在x/y轴中
let point = (3,3);
switch point {
case (let x, 0):
print("在x轴上: \\\\(x)"); // 绑定后,在这里即可以进行使用
case (0, let y):
print("在y轴上: \\\\(y)");
case let(x, y):
print("具体坐标: (\\\\(x),\\\\(y))");
}
输出结果: 具体坐标:3,3
-
switch
的where
模式。case
分支的模式可以使用where
来判断额外条件:
// 判断点是否在坐标系的对角线上
let point = (-3,3);
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("具体坐标: (\\\\(x),\\\\(y))");
}
输出结果: 在x==-y对角线上
<br />
四、控制转移语句
控制转移语句,是改变代码的执行顺序,通过它可以实现代码的跳转。
-
continue
即循环体立即停止本次循环,重新开始下一次循环,但并不是离开整个循环体:
for index in 1...5 {
if index == 3 { // index为3的时候,停止本次循环,重新下一次循环
continue;
}
print(index);
}
输出结果: 1 2 4 5
-
break
语句会立即结束循环体:
for index in 1...5 {
if index == 3 { // index为3的时候,即退出for-in
break;
}
print(index);
}
输出结果: 1 2
-
fallthrough
贯穿语句。在swift中switch
不会从上一个case
分支执行到下一个case
分支中。而在C语言中,在每个case
分支之后,需要加上break
语句来阻止自动执行到下一个case
分支中。如果你需要C语言中的贯穿特性,每个需要该特性的case
分支中加入fallthrough
关键字:
let index = 3;
switch index {
case 1:
print("早上好");
case 2:
print("中午好");
case 3:
print("下午好");
fallthrough; // 表需要贯穿特性
case 4:
print("晚上好");
fallthrough; // 表需要贯穿特性
default:
print("洗洗睡");
}
输出结果:
下午好
晚上好
洗洗睡
注意:
fallthrough
关键字不会检查它下一个将会执行case
中的匹配条件。fallthrough
简单地使代码执行继续连接到下一个case
中的执行代码,这就和C语言的switch
语句特性一样的。
- 带标签的语句。
switch
代码中是可以嵌套循环体和switch
来创建复杂的控制流结构。但循环体和switch
代码块两者都可以使用break
语句来提前结束整个方法体。因此要明确指定break
语句想要终止的是哪个循环体或哪个switch
代码块。关键字continue
也一样可以指定。
// while循环,并指定这个标签为loop1
loop1:while index < 3 {
index += 1;
loop2:for temp in 1...3 {
// 当index为2时候结束loop2循环
if index == 2 {
print("下一次再见,swift\\\\(index)-\\\\(temp)");
break loop2;
}
// 当index为3的时候,最外层loop1循环将结束
if index == 3 {
print("不再见...");
break loop1;
}
print("swift\\\\(index)-\\\\(temp)前来报到...");
}
}
输出结果:
swift1-1前来报到...
swift1-2前来报到...
swift1-3前来报到...
下一次再见,swift2-1
不再见...
(备注: return
函数的返回值,throw
错误/异常的抛出)
<br />
五、退出操作
-
guard
语句类似于if
语句,执行取决于与表达式的布尔值(在自定义异常的时候使用到)。可以使用guard
语句来要求条件必须是真时,以执行guard
语句后的代码。不同于if
语句,一个guard
语句总是有一个else分句,如果天剑不为真则执行else
分句中的代码:
func greet(person: [String: String]) {
// 判断关键字name对应是否有值
guard let name = person["name"] else {
return; // 如果没有值,那么就直接退出
}
print("Hello \\\\(name)");
// 关键字location对应是否有值
guard let location = person["location"] else {
print("你在哪里?")
return
}
print("我正在购买到\\\\(location)的机票")
}
greet(["name": "Swift"]);
输出结果: Hello Swift 你在哪里?
greet(["name": "Swift", "location": "美国"]);
输出结果: Hello Swift 我正在购买到美国的机票
<br />
六、检测API可用性
- swift有检查API可用性的内置支持,这可以确保我们不会不小心地使用对于当前部署目标不可用的API,从而导致程序在编译期间报错:
/**
参数1:在iOS系统上,只有iOS 9及更高版本中执行;
参数2:在OS X系统上,只有 OS X v10.10及更高版本中执行;
参数3:' * '必须写的,用于处理未来潜在的平台;
*/
if #available(iOS 9, OSX 10.10, *) {
// 在 iOS 使用 iOS 9 的 API, 在 OS X 使用 OS X v10.10 的 API
} else {
// 使用先前版本的 iOS 和 OS X 的 API
}