Swift提供了所有大家熟悉的控制流语法,其中包含多重循环的while和for循环;根据一定条件执行不同分支的if、guard和switch语法;以及控制流程转移的break和continue。
除此之外,Swift在for循环的基础上,增加了for-in循环。for-in循环可以快速帮你提取数组内的元素,同样支持字典、字符串以及其他集合。
swift的switch语法是非常强大的。它使得流程更加清晰化,让我想到了强大的AOP框架。在swith中的每个case,你不需要使用break返回,它是自动执行break *** 作的,不会执行下一个case内的代码。同时switch还支持其他强大的功能,如间隔匹配、元祖匹配、区域匹配、临时绑定常量匹配以及匹配时使用where做增加匹配。
For循环Swift中的for循环提供了两种常用的模式,for-in和for
- for-in在遍历的过程中,能帮你快速提取元组中的对象;
- for和其他开发语言的for一样,中间三个条件,用“;”分割。
// MARK: for-in循环private func testForIn() { // 直接循环提取内部数据 // [1,5] for index in 1...5 { print("\(index) times 5 is \(index * 5)") } // 不需要提取数据,只需要循环次数 let base = 2 let power = 3 var answer = 1 for _ in 1...power { answer *= base } print("\(base) to the power of \(power) is \(answer)") // array遍历 let array = ["阳君","937447974"] for item in array { print("array:\(item)!") } // Dictionary遍历 let dict = ["name":"阳君","qq":"937447974"] for (key,value) in dict { print("key:\(key);value:\(value)") }}For
For的一般结构如下所示:
例子代码如下:
// MARK: - 传统for循环private func testFor() { for var index = 0; index < 3; index++ { print("index is \(index)") }}While循环
While循环执行其内部的代码,直到条件为假。wihile提供了两种循环模式:
- while是先执行条件判断后执行内部代码;
- repeat-while是先执行内部代码后执行条件判断。
结构图:
// MARK: - While循环private func testWhile() { // 先执行while条件判断,后执行内部代码 let count = 4 var index = 0 while index < count { index++ print("while:\(index)") }}Repeat-While
结构图:
// MARK: repeat-while循环private func testRepeatWhile() { // 执行内部代码后判断条件 let count = 4 var index = 0 repeat { index++ print("RepeatWhile:\(index)") } while index < count}条件分支
条件分支主要用于在特定的条件执行不同的代码。当一个情况发生时,你可能想运行额外的代码,要做到这一点你就需要使用条件分支。
当你想在代码中使用条件分支时,Swift提供了两种语法if和switch。通常情况下你可以使用if来做普通的条件判断,当你的应用场景复杂化时可以是switch来代码分支。
Ifif后跟的条件为真时,执行括号内的代码,否则跳过。
// MARK: if 判断private func testIf() { // 一个条件一个条件的判断,当条件为真时,执行内部程序 let temp = 90 if temp <= 32 { // 不执行 } else if temp >= 86 { print("执行") } else { // 不执行 }}Switch
Switch使用一个值去case匹配几种可能,当匹配成功时,执行其内部代码。结构图:
// MARK: swich判断private func testSwitch() { // 基本switch,case不会穿透。 let someCharacter: Character = "a" switch someCharacter { case "a": print("1") case "a","b","c": print("2") //这里不会输出,case找到后,执行完毕就返回 default: print("未找到") }}范围匹配
如同刻度尺,switch可以帮助你快速让一个点落到一个刻度尺范围内。它还可以帮你落到一个时间间隔内。
private func testSwitchIntervalMatching() { // 范围选择 let approximateCount = 2 switch approximateCount { case 1..<5: print("[1,5)") case 5..<10: print("[5,10)") default: print("未找到") }}元组
在switch中你还可以使用元组匹配,如坐标点(1,1)。如果你只想匹配y,不关心x的值,你可以使用(_)
,也就是匹配(1,_)
。
// MARK: switch元组选择private func testSwitchTuples() { // 元组选择,坐标轴测试 let random = arc4random()// 随机数 let somePoint = (Int(random%3),Int(random%3))// 随机数获取点 switch somePoint { case (0,0): print("(0,0) is at the origin") case (_,0): print("(\(somePoint.0),0) is on the x-axis") case (0,_): print("(0,\(somePoint.1)) is on the y-axis") case (-2...2,-2...2): print("(\(somePoint.0),\(somePoint.1)) is insIDe the Box") default: print("(\(somePoint.0),\(somePoint.1)) is outsIDe of the Box") }}值绑定
当你使用元组匹配,而不关心匹配时的某个值,但你想拿到匹配成功的值,就可以使用值绑定,并用let声明的属性去获得这个值。
// MARK: switch值选择private func testSwitchValueBindings() { let random = arc4random()// 随机数 // 值绑定,如果设置未知数,当匹配成功时,执行此代码 let anotherPoint = (Int(random%3),Int(random%1)) switch anotherPoint { case (let x,0): print("\(x),x匹配") case (0,let y): print("\(y),y匹配") case let (x,y): print("(\(x),\(y)),其他") }}值绑定和Where
在值绑定时,我们可以用where给未知数设置条件,当符合这个条件并且值绑定成功后才会执行内部语句。
// MARK: switch值绑定和whereprivate func testSwitchValueBindingsWhere() { // 使用where条件二次判断 let random = arc4random()// 随机数 let yetAnotherPoint = (Int(random%3),Int(random%3)) switch yetAnotherPoint { 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)") }}控制转移
控制转移可以帮助你改变代码执行的顺序。在swift中,控制转移有5种语法:
- continue
- break
- fallthrough
- return
- throw
跳过当前循环,并继续执行下一次循环。
// MARK: continueprivate func testContinue() { // 跳过本次循环,继续执行下次循环 for index in 1...5 { if index == 2 { continue } print("continue:\(index)") }}Break
Break主要在for循环和switch中使用。在for循环中就是停止for循环,继续执行for循环体后的代码;在switch中,break以为着switch代码块执行结束,继续执行switch代码块后的代码。
// MARK: breakprivate func testBreak() { // 跳过当前for或者switch,继续执行 for x in 1...5 { if x == 2 { break } print("break-x:\(x)") } print("break-for") let z = 0 switch z { case 0: break; default: break; } print("break-switch")}Fallthrough
在swift中switch的case内的代码执行完毕后,默认执行break *** 作,这就意味着,你无法同时执行两个case内的代码。当你执行完毕一个case内的代码后,还想执行下一个case内的代码,就需要使用fallthrough(击穿)。
// MARK: fallthroughprivate func testFallthrough() { // 击穿:执行当前case内的代码,并执行下一个case内的代码 let x = Int(arc4random()%1)// 0 switch x { case 0: print("0") fallthrough case 1: print("1") fallthrough default: break; }}标签
在swift中,使用标签声明的代码块,在其内部你可以快速使用break停止这个标签体,或使用continue重新执行这个标签内的代码。
// MARK: 标签private func testLabeledStatements() { // 标签语句,可以直接跳到写标签行的代码 var b = false go : while true { print("go") switch b { case true: print("true") break go // 跳过go标签的代码 case false: print("false") b = true continue go // 继续执行go标签的代码 } }}提前退出
Guard语法和if很类似,在if中,当条件为true时执行其内部代码。guard和else合用,与if的差异性在于当条件为true跳过内部代码;条件为false时执行内部代码。
// MARK: - 提前退出private func testEarlyExit() { // guard和if很像,当条件判断为假时,才执行else中的代码 func greet(person: [String: String]) { guard let name = person["name"] else { print("无name") return } print("name: \(name)!") } greet([:]) greet(["name": "阳君"])}检查API可用性
当你在swift中使用IOS9新增加的代码,而用户的手机使用的系统是IOS8时。程序运行到此处app会闪退,这是很不好的用户体验。swift根据这种情况,增加了用户版本判断工具#available()。
// MARK: - 检查API可用性private func testCheckingAPIAvailability() { if #available(iOS 9.1,OSX 10.10,*) { print("iOS 9.1,*") } else { print("低版本") }}其他 参考资料
The Swift Programming Language (Swift 2.1)
文档修改记录时间 | 描述 |
---|---|
2015-10-26 | 根据 The Swift Programming Language (Swift 2.1)总结 |
版权所有:http://blog.csdn.net/y550918116j
总结以上是内存溢出为你收集整理的Swift控制流全部内容,希望文章能够帮你解决Swift控制流所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)