前言:
本篇为视频学习笔记
区间匹配、元祖匹配
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