您的位置:首页 >> APPLE >> 和屌丝一起学SWIFT-控制流
和屌丝一起学SWIFT-控制流
[ 孤狼 | 2015-12-07 12:38:14 | APPLE ]

声  明

       本教程仅用于初学SWIFT同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用SWIFT版本为2.0。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。PAEA.CN版权所有。


        萨瓦迪卡,欢迎回到和屌丝一起学SWIFT系列教程中来,上节我们说了集合,内容有点多,大家还能还能招架的住嘛.这节也不轻松哦,打起精神一起来学习另一个比较重要的东西-控制流吧.

        

        控制流是每个语言中都含有的必不可少的一部分,控制流包括了条件判断,循环的功能,主要用来控制程序的走向及执行路线.



[循环]

[for循环]

for循环几乎出现在每一种编程语言中,他也是使用频率最高的循环语句.for循环的使用也非常容易.

for循环的语句格式 for(变量;条件;变量操作){循环操作} for 变量;条件;变量操作{循环操作}


TIP:在许多语言中,for循环的格式都是 for(){} 而SWIFT可以直接使用 for {} 样式编写,小括号可以省略,而在一些语言中小括号必须带上.所以在SWIFT中加不加小括号意义一样,但如果你还会其他语言,建议你还是保持习惯加上小括号,避免适应SWIFT之后对其他语言造成遗忘.本作者这里就保持PHP的习惯加上小括号使用了.


for(var i=0;i<3;i++){
    print(i);
}

输出012


这里要说的是,for循环是先执行判断,然后才会执行,所以,如果你的条件一开始就是不符合的,那么一次都不会运行.

上面式子的运算方式流程如下:

1.创建 var i=0;
2.判断 i<3 成立,进入循环体
3.执行循环体 print(i) 输出0
4.循环体执行结束,执行变量操作,i++ (此时i变为1)
5.判断 i<3 成立,进入循环体
6.执行循环体 print(i) 输出1
7.循环体执行结束,执行变量操作,i++ (此时i变为2)
8.判断 i<3 成立,进入循环体
9.执行循环体 print(i) 输出2
10.循环体执行结束,执行变量操作,i++ (此时i变为3)
11.判断 i<3 不成立,退出循环

我们可以看到整个for循环的过程中,变量只赋值一次,然后就开始 条件判断->循环体执行->变量操作 的循环 直到条件不符合退出循环.


我们在写for循环的时候尤其要注意的是,一定注意逻辑设计,不能出现永远成立的情况,不然会死循环,一直执行,然后崩溃,然后死机,然后bong!!!灰飞烟灭....

for(var i=0;i<1;i--){
    print(i);
}

上面这段程序,就会永远执行下去,直到你终止为止.


[for...in循环]

我想这个大家都不陌生了,因为前面的课我们一直都在用.

for...in 的语句格式是 for 变量 in 集合{执行语句}

for...in一般用来枚举一个集合里的值,就是把一个集合里的值,依次提取出来使用.这里我们要注意的是,提供的集合也要是有限集合,否则也会死循环哦.

var a=[1,2,3];
for i in a{
    print(i);
}

输出123


for...in能循环几次,全看你提供的集合有多少位.

那么我们来看下上面的式子的流程:

1.将a集合中的第一位赋值给变量i
2.执行循环体. print(i) 输出1
3.将a集合中的第二位赋值给变量i
4.执行循环体. print(i) 输出2
5.将a集合中的第三位赋值给变量i
6.执行循环体. print(i) 输出3

可以看出,for...in就是依次赋值,然后执行循环体,还是比较好理解的.


[while循环]

while在英语中是"当.."的意思,这就很好理解了,那就是当条件满足就一直循环,直到条件不满足.

while的语句格式是 while(条件){循环体} while 条件{循环体}

var i=0;
while(i<2){
    print(i);
    i++;
}

输出01


上面式子的执行流程是:

1.判断i<2,成立,进入循环体.
2.执行循环体,输出0,i自增,i变为1.
3.判断i<2,成立,进入循环体.
4.执行循环体,输出1,i自增,i变为2.
5.判断i<2,不成立,退出循环.

这里我们看到while和for很接近,只是格式不一样,for是先把条件和变量操作都写出来,而while只要写条件,变量操作要自己写进循环体内.


TIP:很多人在写while的时候忘了把变量操作写进循环体,导致死循环,所以使用while要注意这一点.


[repeat-while循环]

repeat-while与while的操作一致,他们唯一的不同就是while是先判断后执行,而repeat-while是先执行后判断.

repeat-while的语句格式是 repeat{循环语句}while(条件)repeat{循环语句}while 条件

var j=0;
repeat{
    print(j);
    j++;
}while(j<2);

输出01


上面式子的执行流程是:

1.执行循环体,输出0,j自增,j变为1
2.判断j<2,成立.继续执行
3.执行循环体,输出1,j自增,j变为2
4.判断j<2,不成立.退出执行.

这类可能大家会觉得这结果和while一样啊,没有什么不同啊?那我们来个对比.


[while和repeat-while对比]

var i=2;
while(i<2){
    print("i="+String(i));
    i++;
}
var j=2;
repeat{
    print("j="+String(j));
    j++;
}while(j<2);

一起执行后,结果是"j=2"

这里我们可以看到,只输出了"j=2",所以上面的while循环是没有执行的,因为他一开始就不满足循环条件,而下面的repeat..while由于是先执行后判断的原因,所以先执行了一遍.


[条件判断]


[if]

if 语句是最基本的条件判断语句了,几乎所有的编程语言都支持.在SWIFT中,if同样不要求必须写小括号.

var a=4;
if(a>1){
    print("a大于1");
}

输出:a大于1


[if...else]

if只是一个单独的判断,我们能够判断真,那么假怎么处理呢,这就要用到else了.

var a=0;
if(a>1){
    print("a大于1");
}else{
    print("a不大于1");
}

输出:a不大于1


[if..else if...else]

有时候我们可能会判断很多条件,那么我们就可以使用if..else if..else这种方法来进行多次判断.


TIP:else if的次数是不限制的哦,可以无限次,另外else是可以不写的.


var a=5;
if(a=0&&a<5){
    print("a大于等于0,小于5");
}else{
    print("a大于等于5");
}

输出:a大于等于5


[switch]

switch和if..else if..else是基本一致的,但是switch在大量匹配的时候效果要比单纯的if else更方便.

在switch运行中,会逐个判断,直到遇到了匹配的,然后运行里面的代码.switch语句的格式是

switch(匹配变量){
case 匹配变量值:
    匹配后要执行的代码
case 匹配变量值:
    匹配后要执行的代码
default:
    如果都没有匹配则要执行的代码
}


TIP:SWIFT中的switch是不需要写break的哦.如果你是第一次学程序,你要知道的是,其他语言中,switch是需要break来打断的,否则即使匹配成功也会继续下面的匹配,而SWIFT中的switch是自动break结束的.当然,如果你想提前退出switch也可以使用break退出.


var a="北京";
switch(a){
case "北京":
    print("这里是北京");
case "河北":
    print("这里是河北");
default:
    print("没有匹配到");
}

输出:这里是北京


TIP:switch语句里必须有default选项来匹配没有匹配成功的状态.


同时switch还能同时匹配多个值

var a="北京";
switch(a){
case "北京","河北","黑龙江":
    print("这里是华北");
case "河南","山东":
    print("这里是华中");
default:
    print("这里是中国");
}


输出:这里是华北


我们可以看出,case所列出的匹配值是可以有多个的.我们也可以使用判断条件来匹配

switch还支持区间匹配

var a=68;
switch(a){
case 0...59:
    print("不及格");
case 60...69:
    print("及格");
case 70...79:
    print("良");
case 80...89:
    print("优");
case 90...100:
    print("优+");
default:
    print("请家长");
}

输出:及格


这里我们看出,switch支持的区间能够帮助我们直接判断一些具有区间性的数据

switch还支持元组匹配

var a=(1,3);
switch(a){
case (1,1):
    print("这里是(1,1)");
case (1...3,1...3):
    print("这里是\(a)");
case (_,4):
    print("这里是\(a)2");
default:
    print("没有匹配上");
}

输出:这里是(1, 3)


TIP:区间中,可以使用_来代替任何可能的值.


switch还能进行绑定操作,使用方法就是在case 匹配的内容中,使用一个新定义的常量或变量

var a=(1,2);
switch(a){
case (var i,1):
    print("匹配了(\(i),1)");
case (1,var i):
    print("匹配了(1,\(i))");
case (var i,var j):
    print("匹配了(\(i),\(j))");
}

输出:匹配了(1,2)


TIP:这里的switch没有写默认的default分支但却没有报错,原因是在switch中最后一个分支可以接受全部的可能性.所以这里即使不写default,也是可以运行的.


switch还能使用where支持额外的条件判断

var a=4;
switch(a){
case 1,2,3 where a<4:
    print("匹配了123");
case 1,2,3 where a>10:
    print("匹配了第二项");
case 4,6,7 where a<10:
    print("匹配了第三项");
default:
    print("都没有匹配");
}

输出:匹配了第二项

什么?不对啊,不是应该输出 匹配了第三项 嘛?

这里需要说明的是,这个where是有使用条件的,只能在通配的情况下来使用where判断,如果在where前就能通过case匹配,那么就会直接匹配不进行where判断.这里还是要感谢网友 Mr梵谷 的提醒.

那么怎么正确的使用where呢?

var a=4;
switch(a){
case a where a<4:
    print("匹配了123");
case a where a>10:
    print("匹配了第二项");
case a where a<10:
    print("匹配了第三项");
default:
    print("都没有匹配");
}

输出"匹配了第三项"

像这样使用变量自己来进行通配,然后才会启动where来进行判断.

不过这里官方所谓的额外有点不准确,这还是只有一种方式,而不是同时2种共同匹配.



[控制转移语句]

[continue]

continue的作用是控制程序停止本次循环,立刻进入下次循环.

for(var i=0;i<10;i++){
    if(i==8){
        continue;
    }
    print(i);
}

输出:12345679


[break]

break的作用就是中断程序的运行.跳出循环体.适用于for,switch,while.

for(var i=0;i<10;i++){
    if(i==5){
        break;
    }
    print(i);
}

输出:01234


[fallthrough]

在SWIFT中switch是默认匹配成功后就会结束switch流程,但是在其他语言中,switch会一直匹配到最后,直到遇到break,那么我们怎么来实现其他语言的效果呢?就是使用fallthrough

var a=0;
switch(a){
case (0...3):
    print("他是0到3的数");
    fallthrough;
case (0...5):
    print("他是0到5的数");
    fallthrough;
case (0...10):
    print("他是0到10的数");
    fallthrough;
default:
    print("他不是0到10的数");
}

输出:他是0到3的数 他是0到5的数 他是0到10的数 他不是0到10的数

可以看到,他是一直贯穿执行的.只要是匹配他的都可以继续执行.


[混合嵌套使用]

循环和判断是可以混合嵌套使用的,不是只能自己独立使用.

var a=6;
if(a>0){
    if(a>5&&a=10
        print("数字大于等于10");
    }else{
        //1-5
        switch(a){
        case 1:
            print("1");
        case 2:
            print("2");
        case 3:
            print("3");
        case 4:
            print("4");
        case 5:
            print("5");
        default:
            print("在我范围内,但是我无法匹配他");
        }
    }
}else{
    print("请传入一个大于0的值")
}

输出012345


好了,今天就学到这里,我们下节课再见!Bye!


本节代码下载


转载请注明出处:http://gl.paea.cn/apple/content/2015/12/07/84.html