前言:
本篇为视频学习笔记
区间匹配、元祖匹配
let count = 62
switch count {
case 0:
print("none")
case 1..<5:
print("a few")
case 5..<12:
print("several")
case 12..<100:
print("dozens of")
case 12..<100:
print("hundreds of")
default:
print("many")
}
★区间匹配:看count在不在这个区间内,很明显62是在case 12..<100: 这个范围,打印出来就是dozens of值
let point = (1,1)
switch point {
case (0,0):
print("the origin")
case (_,0):
print("on the x-axis")
case (0,_):
print("on the y-axis")
case (-2...2,-2...2):
print("inside the box")
default:
print("outside of the box")
}
★元祖匹配:相当于switch不仅仅是支持整型、字符串、字符,也支持元祖。
那么这个point明显就是一个元祖,我们把元祖放到switch point这个位置,照样是匹配,很明显这个元祖是(1,1)不是(0,0)。(0,)下划线代表忽略某个值,说白了就是只要求元祖右边是0。(0,)代表只要求元祖左边为0.以上 (0,0)、(,0)、(0,)都是不匹配的,再看下面一个,(-2...2,-2...2),元祖左边、右边1都符合-2...2条件,就会打印出来 print("outside of the box")。
其实这段代码是干什么的呢?你可以想像(1,1)是二维平面上的一个点,判断一下这个点,在哪里。明明(1,1)这个点是在这个正方形(-2...2,-2...2)里。如下图:
★ 可以使用下划线_忽略某个值
★ 关于case匹配问题,属于模式匹配(Pattern Matching)的范畴
值绑定
let point = (2,0)
switch point {
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 an y value of \(y)")
case let(x,y):
print("somewhere else at (\(x),\(y))")
} // on the x-axis with an x value of 2
case 成立的时候,想把 point = (2,0)中的值拿来用,怎么做呢?我们就可以在 case (let x,0)里写一个变量或者常量,说白了就是0你要匹配,0匹配完了就可以了,这个时候,会将2赋值给 let x,到时候这个条件就成立了。然后就会执行print("on the x-axis with an x value of (x)"),由于你是将2赋值给了let x,所以最终打印结果就是on the x-axis with an x value of 2这一句。
说白了就是,带有值绑定的,只需要一方符合题条件即可。
★ 必要时let 也可以改为var
where
let point = (1,-1)
switch point {
case let (x,y) where x == y:
print("on the line x == y")
case let (x,y) where x == -y:
print("on the line x == -y")
case let (x,y):
print("(\(x),\(y)) is just some arbitrary point")
}// on the line x == -y
let (x,y)这样写代表没有任何条件,x、y可以是谁都可以接受,也就是说1会将值赋值给x,-1将值赋值给y,where后面是加条件,也就是(1,-1)赋值给(x,y)之后,会执行where后面的条件。比如:let (x,y) where x == y:,赋值完毕后,要求x等于y,他才会执行输出代码print("on the line x == y")。
★ where不仅可以用到case后边,还可以用到for循环里面,如下:
// 将所有正数加起来
var numbers = [10,20,-10,-20,30,-30]
var sum = 0
for num in numbers where num > 0 { // 使用where来过滤num
sum += num
}
print(sum) // 60
首先,我们先不看where,意思着将数组中所有的元素都便利一遍,然后便利一个元素就赋值给num,执行大括号里面的代码。执行完之后,再取出下一个元素,依次执行。
加一个需求,将数组中所有正数加起来,相当于10,20,30便利出来,相加。过滤不想要的元素,加一个where条件where num > 0,也就是说numbers在取出元素赋值给num会判断,如果便利到-10,赋值给num的时候,发现不符合where num > 0这个条件的时候,所以它就不会执行大括号里面的代码。紧接着,便利下一个元素,依次执行。
★ where是用来过滤的,要不要进入大括号,不是决定整个for循环要不要退出的问题
<例子>
var numbers = [1,2]
for num in numbers where num > 0 {
}
一开始的时候,肯定是将numbers的第一个元素赋值给num,然后num符合条件,然后执行大括号里面的代码,这个没有任何疑问。
问题是var numbers = [-1,2] 一开始这个不符合,一开始先将-1赋值给num,明显num不符合条件where num > 0 ,注意,不符合条件,仅仅是代表num不会进入大括号,接下来还会编译下一个元素,不是代表一发现条件不成立,整个for循环,都退出了。作用不是break,相当于continue
标签语句
outer: for i in 1...4 {
for k in 1...4 {
if k == 3 {
continue outer
}
if i == 3 {
break outer
}
print("i == \(i),k == \(k)")
}
}
我们写了一个for循环,又嵌套了一个for循环,最外for循环我们写了一个标签outer,outer就代表外层for循环。如果我们在内层for循环写一个continue和一个break。我们想一下,默认情况下,continue、break是不是控制的是for k in 1...4这个for循环,如果continue、break要控制外面for循环,那么加上标签就好了。
结果:
i == 1,k == 1
i == 1,k == 2
i == 2,k == 1
i == 2,k == 2