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语句出现的代码段。可为return
,break
,continue
,throw
或者条用一个不返回的方法或函数,例如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