Swift学习(四:控制流)
1. For- In循环
for index in 1...5{
print (index)
}
注意:
index
是一个每次循环遍历开始时被自动赋值的常量。这种情况下不需要声明,只需要将它包含在循环的声明中,就可以对其进行隐式声明,而无需使用let关键字声明。
-
如果不需要知道每一项的值,可以使用
_
代替变量名来忽略对值的访问。for _ in 1...10{ print("haha") }
-
遍历数组
let names = ["aa","ss","dd"] for name in names { print("hello\(name)") }
-
遍历字典
let dic = ["aa" : "AA", "ss" : "SS","dd" :"DD"] for (key,value) in dic{ print("\(key) : \(value)") }
2.While循环
-
while
循环,每次在循环开始时计算条件是否符合while condition { statements }
-
repeat-while
循环,每次在循环结束时计算条件是否符合
repeat {
statements
} while condition
3. 条件语句
var a = 10
if a <=11{
print("haha")
}else if{
print("...")
} //haha
4.Switch
每一个 case
都是代码执行的一条分支,这与if语句类似。与之不同的是,switch
语句会决定哪一条分支应该被执行。
switch
语句必须是完备的。这就是说,每一个可能的值都必须至少有一个case
分支与之对应。在某些不可能涵盖所有值的情况下,你可以使用默认(default
)分支满足该要求,这个默认分支必须在switch
语句的最后面。
let index : Character = "e"
switch index {
case "a","b","c":
print("hehe")
case "s","d","f":
print("haha")
default:
print("\(index)")
}
注意:*在 Swift 中,当匹配的 case 分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个 case 分支。这也就是说,不需要在 case 分支中显式地使用break语句。这使得switch语句更安全、更易用,也避免了因忘记写break语句而产生的错误。
每一个 case 分支都必须包含至少一条语句
-
一个 case 也可以包含多个模式,用逗号把它们分开(如果太长了也可以分行写):
switch index { case value1, value2: statements }
-
区间匹配
let a = 20 var c : String switch a { case 0 : c = "no" case 1..<5: c = "a few" case 5..<10: c = "several" default: c = "many" } print("\(c)") //many
-
元组
let a = (1,1) switch a { case(0,0): print("1") case( _ , 0 ): print("2") case( 0 , _): print("3") case(-2...2,-2...2): pint("4") } //4
下面的例子展示了如何在一个(Int, Int)类型的元组中使用值绑定来分类下图中的点(x, y):
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
print("on the x-axis with an x value of \(x)")
case (0, let y):
print("on the y-axis 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"
-
where
case 分支的模式可以使用where语句来判断额外的条件let yetAnotherPoint = (1, -1) switch yetAnotherPoint { case let (x, y) where x == y: print("(\(x), \(y)) is on the line x == y") case let (x, y) where x == -y: print("(\(x), \(y)) is on the line x == -y") case let (x, y): print("(\(x), \(y)) is just some arbitrary point") } // 输出 "(1, -1) is on the line x == -y"
5.控制转移语句
swift有5种控制转移语句:continue
,break
,fallthrough
,return
,throw
-
Continue
continue
语句告诉循环体停止本次循环,重新开始下一次循环,而不是终止整个循环。let input = "great minds think alike" var b = " " for c in input.characters { switch c { case "a","e","i","o","u"," ": continue default: b.append(c) } } print(b)
-
Break
立刻结束整个控制流的执行let numberSymbol: Character = "三" // 简体中文里的数字 3 var possibleIntegerValue: Int? switch numberSymbol { case "1", "١", "一", "๑": possibleIntegerValue = 1 case "2", "٢", "二", "๒": possibleIntegerValue = 2 case "3", "٣", "三", "๓": possibleIntegerValue = 3 case "4", "٤", "四", "๔": possibleIntegerValue = 4 default: break } if let integerValue = possibleIntegerValue { print("The integer value of \ (numberSymbol) is \(integerValue).") } else { print("An integer value could not be found for \(numberSymbol).") } // 输出 "The integer value of 三 is 3."
-
贯穿
Fallthrough
Swift 中的switch
不会从上一个case
分支落入到下一个 case
分支中。相反,只要第一个匹配到的 case
分支完成了它需要执行的语句,整个switch代码块完成了它的执行。相比之下,C 语言要求你显式地插入break
语句到每个switch分支的末尾来阻止自动落入到下一个 case
分支中。Swift 的这种避免默认落入到下一个分支中的特性意味着它的switch 功能要比 C 语言的更加清晰和可预测,可以避免无意识地执行多个case
分支从而引发的错误。
如果你确实需要 C 风格的贯穿的特性,你可以在每个需要该特性的case
分支中使用fallthrough
关键字。下面的例子使用fallthrough
来创建一个数字的描述语句。
let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
description += " a prime number, and also"
fallthrough
default:
description += " an integer."
}
print(description)
// 输出 "The number 5 is a prime number, and also an integer."
-
提前退出
guard
a = 7
guard a >= 10 else { return }
//return -
检测API可用性
if #available(iOS 9, OSX 10.10, *) { // 在 iOS 使用 iOS 9 的 API, 在 OS X 使用 OS X v10.10 的 API } else { // 使用先前版本的 iOS 和 OS X 的 API }