专栏名称: _正阳_
目录
相关文章推荐
闹闹每日星运  ·  星历1225:金牛养成好习惯 狮子理性做事 ·  2 天前  
福州新闻网  ·  热搜!福州“躺平凳”走红,太懂人心了! ·  昨天  
福州新闻网  ·  热搜!福州“躺平凳”走红,太懂人心了! ·  昨天  
北京LOOK  ·  姆明来北京了!冰雪小镇开放啦|北京LOOK ·  4 天前  
北京LOOK  ·  姆明来北京了!冰雪小镇开放啦|北京LOOK ·  4 天前  
投资界  ·  最近,重庆挤满了泰国人 ·  5 天前  
投资界  ·  最近,重庆挤满了泰国人 ·  5 天前  
51好读  ›  专栏  ›  _正阳_

★学习笔记:《iOS高级:Swift入门精讲②》第一节 Swift编程-01➡04-switch02

_正阳_  · 简书  ·  · 2019-07-22 19:06

正文

前言:
本篇为视频学习笔记

区间匹配、元祖匹配

 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)里。如下图:


image.png

★ 可以使用下划线_忽略某个值
★ 关于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