Swift(六、控制流)

前端之家收集整理的这篇文章主要介绍了Swift(六、控制流)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、Swift入门学习笔记(第一版),对Swift的基础知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~

2、在学习完基本的知识点以后会结合官方文档及相关资料,在此版本的基础上进行添加更改。


六、控制流


本文只对Swift区别于C和OC的部分进行记述


1、For-In

此语句在OC中已有,此处结合Swift中的一些语法特点进行说明

let base = 2
let power = 8
var answer = 1
for _ in 1...power {    //不需要知道区间序列每一项的值,使用下划线_替代变量名来忽略对值的访问
    answer *= base
}                       //2的8次幂
print("\(base) to the power of \(power) is \(answer)")

Output:

2 to the power of 8 is 256

for-in遍历字典,字典的每项元素会以(key,value)元组的形式返回

let ageOfMember = ["Son":21,"Mother":45,"Father":47]
for (memberName,memberAge) in ageOfMember {
    print("\(memberName) is \(memberAge) years old")
}

Output:

Son is 21 years old
Father is 47 years old
Mother is 45 years old

2、while语句

2.1、while循环

while condition {
    statements
}

2.2、repeat-while

//类似于C中的do-while循环语句
repeat {
    statements
} while condition

3、switch语句

3.1、不存在隐式的贯穿

此为区别于C和OC的点,当匹配的case分支代码执行完毕时,程旭辉终止switch语句,不会继续执行下一个case分支,不需要显式地加break。但是case语句中break提前跳出仍适用(case分支多个语句时)

3.2、每一个case分支都必须包含至少一个语句!

3.3、一个case可以包含多种匹配情况

3.4、区间匹配

let month = 2
switch month {
    case 1...2,12:print("Winter")
    case 3...5:print("Spring")
    case 6...8:print("Summer")
    case 9...11:print("Autumn")
    default:print("Month is out of range")
}

Output:

Winter

3.5、元组

1、例如坐标(1,1)可以用(0,_),(_,0),(-2...2,-2...2)等多种情况进行匹配

2、区别于C语言,swift语言允许多个case匹配同一个值,但是只会执行第一个被分配到的case分支

3.6、值绑定(Value Bindings)

case分支允许将匹配的值绑定到一个临时的常量/变量,此常量/变量在该case分支中即可被引用

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))")
}

Output:

on the x-axis with an x value of 2

3.7、where语句

case分支中使用where语句来判断额外的条件

let testPoint = (1,1)
switch testPoint {
case let(x,y) where x == y:
    print("(\(x),\(y)) is on the line x == y")
case let(x,y):
    print("(\(x),\(y)) is not on the line x == y")
}

Output:

(1,1) is on the line x == y

let(x,y)已经匹配余下所有值的元组,因此可以不包含default分支


4、控制转移语句

4.1、Continue

在一个形如for的循环体中,调用Continue语句,立刻停止本次循环迭代,重新开始下次循环迭代(不会离开整个循环体)

4.2、Break

立刻结束整个控制流的执行

a、提早结束一个switch代码块,跳转到switch代码块结束的大括号}后的第一行代码
b、一个循环体,立即中断该循环体执行,跳转到循环体结束的大括号}后的第一行代码

4.3、贯穿FallThrough

使得Swift中的switch拥有C语言的贯穿风格,从上一个case分支落入下一个case分支
相当于C语言的switch的case分支结尾没有加break语句

注意:fallthrough不会检查它落入执行的case中的匹配条件,其只是简单地使代码执行继续连接到下一个case中的执行代码。即无论匹不匹配强调内容都会去执行语句

4.4、带标签的语句

这里我的理解是类似于C语言中的goto,但是label**局限于循环体中**

下列以for与switch结合输出1-10的素数,并非十分严谨,在此处纯粹试验此功能

testLoop:for var i = 0;i < 10;i++ {
    switch i {
    case 9:
        break testLoop
    case 2,3,5,7:
        print("\(i) is prime number")
        continue testLoop
    default:
        continue testLoop
    }
}
print("Over")

Output:

2 is prime number
3 is prime number
5 is prime number
7 is prime number
Over

5、提前退出guard


guard总有一个else语句,当guard语句条件不为真执行else中的代码

let i = -1
while true {
    guard i > 0 else{
        print("fault")
        break
    }
}

注意:条件不满足执行else,这个分支必须转移控制以退出guard语句出现的代码。可为returnbreakcontinuethrow或者条用一个不返回的方法函数,例如fatalError()


6、检测API可用性


简言之就是先检测平台,然后在不同的平台上执行不同的API

if #available(iOS 9,OSX 10.10,*) {
    print("iOS 9")
    // 在 iOS 使用 iOS 9 的 API,在 OS X 使用 OS X v10.10 的 API
} else {
    // 使用先前版本的 iOS 和 OS X 的 API
}

a、可以修改iOS版本测试此方法
b、最后一个参数*是必须写的,用于处理未来潜在的平台 c、平台名字:iOS,OSX或watchOS d、除了特定的主板本号像 iOS 8,我们可以指定较小的版本号像 iOS 8.3 以及 OS X v10.10.3

猜你在找的Swift相关文章