swift学习初步(三)--控制流操作

   在上一篇博客里面,我谈到了swift里面的一些基本类型以及相关的操作,相信你看了之后一定会觉得其实swift也不难嘛。好吧,这篇博客里面要谈的一些高级操作,可能会让你有点头疼了。

   好了,废话不多说了,让我们回到正题上面来吧!首先是控制流的操作,如果你熟悉其他语言的花,相信你一定会想到if/else,while,do/while,甚至是switch。没错,其实在swift里面也是这些东东,让我们来看看swift里面能不能变出什么新的花样呢?让我们先来看一看for语句吧!在swift里面for语句有两种形式,第一种是我们在上一篇博客里面用到的for/in操作,让我们来回顾一下:

    var testStrArray=["xiao","cai"];

    var item:String;

    for item in testStrArray{

        println(item);    //遍历数组

   }

   

   var testStrDictionary=["key1":"value1","key2":"value2"];

   for (key,value) int testStrDictionary{

      println(item+value);   //遍历字典,其实还可以单独遍历keys,values,请参考上一篇博客

  }

当然针对Int类型的数组还有一种快捷的方式:

  var index:Int;

  for index in 1...10{

     println(index);

 }

哈哈哈,没错就是使用闭包或者使用半闭包运算符(这里的闭包,跟我们将要在后面提到的闭包是不一样的),当然,如果你在for循环里面不关心item,你可以说使用如下形式:

   for _ in 1...10{

      println("hello world");  //使用_占位符,表示只是简单的循环10次,每次输出一个“hello world”

  }

让我们再来看一看for循环的第二种形式,这种形式跟我们在其他语言里面看到的就非常相似了:

   for var index-0;index<3;index++{

      println(index);  只是在swift里面我们不需要将for里面的条件语句用括号包括起来

  }

    好了,让我们来说一说while和do/while语句吧!这两中语句,跟其他语言里面没有多大的区别:

   while 3<4{

      println("hello world");

   }

    do{

      println("hello world");

    }while 3<4

    相信这两条语言对你来说应该驾轻就熟的吧!希望下面要说的if/elseif/else,switch对你来说也是这样的。

   var flag:Int=10;   

   if flag<=0{

     println("Low zero");

  }

  else if flag>=10{

     println("Big Ten");

  }

  else{

     println("Other Value");

  }

但是这里想要说明一点的是,每个if/else if/else后面一定要加上{},这就跟c#里面不太一样了,比如在c#里面有的时候,我们为了代码的整洁,我可能会写如下代码:

   int flag=10;

   if(flag<=0)

      Console.Writeln("Low Zero");

   else if(flag>=10)

      Console.Writeln("Big Ten");

    else 

      Console.Writeln("Ohter Vlaue");   //我们可以去掉{}

接下来是switch语言,理论上switch和if/else if/else语言是可以相互替换的。让我们来看一看在swift里面switch语言的书写方式吧:

   var condition:String="hello";   //我一般习惯加上类型,不用swift的自推断功能

   switch condition{

    case "xiao":

      println("xiao");

    case "cai":

      print("cai");

    case "hello":

      print("hello");

    default:

      print("No Found");

   }

当你看到这段代码的时候,你也许就会说:“哈哈,小样写错了吧!怎么没有case后面没有break呢?如果没有break的话,岂不是每个case都需要对比一下吗?”,是的,在其他语言里面我们一定要加上break,但是在swift里面,它本身就具有不可贯穿性,即使你没有加上break,只要匹配到一条case之后它就不会再往下面执行了,是不是很智能呢?当然你也可以自己加上break,这样的话就跟其他语言贯通了。比如,你可以写成:

   var condition:String="hello";

   switch condition{

     case "xiao":

         println("xiao");

      break;

    case "cai":

         println("cai");

     break;

    case "hello":

          println("hello");

    break;

    case "xiao":

          println("xiao");

    break;

    case "cai":

    break;

    default:

      println("Not Found");

    break;

  }

看到这段代码,你可能又会说了:“哈哈哈,小样,你是不是又写错了,怎么有两个相同的case呢?”,是的,在这段代码确实有错误,但是错误并不是有两个相同的错误,而是有一个case和break之间没有其他的执行语句。前面我们已经说过了,swift里面的switch具有不可贯穿性,但是它只要匹配到第一条符合条件的case就不会往下执行了,但是我们必须要保证每个case下面必须要有一条可执行的语言(break,conutine不算)。看到这里面你可能还会有一个疑问了,在c#里面我可以同时匹配多个case,在swift里面有没有可能做到呢?肯定是有的,但是写法不一样:

    var condition:String="hello";

    switch condition{

     case "xiao","cai","hello": //将多个条件写在同一个case后面,在c#里面你就需要写多个case,只不过他们公用同一个break而已

       println("xiaocai hello");

     default:

       println("Not Found");

   }

在swift里面指针switch还有几种不同的变体:

   var conditionInt:Int=10;

   switch 10{

   case 1...5:

    println("work");

   case 6...7:

   println("休息");

   default:

   println("加班");

  }

是的,没错又是指针闭包运算符玩出来的新花样。让我们再来看一看当switch遇上元组又回产生怎样的奇妙反应呢?

  let origionPoint=(0,0);

  switch origionPoint {

    case (1,1): 

      print("One Point");

    break;

   case (2,2):  

      print("Two Point");

   break;

  case (_,3);

    println("Y Is 3");

  break;

  }

没错在上面的代码里面,我们尝试加上了break,同时省略了default,还有我们在一个case条件里面运用了占位符,它的意思是:我只想匹配y轴上面是3的点,对于x轴我不关心是什么。

     下面让我们再来加上一条case (let x,let y):,如果我加上这条case会不会产生错误呢?这是完全可行的,不知道你是否记得我们之前提到过的值绑定,在这条case里面的意思就是:我想要将匹配到的值:横坐标上面的值赋值给x,纵坐标上面的值赋值给y。那么你又会问了,这条case什么时候能够匹配到呢?答案是什么时候都会匹配到,所以你使用的时候,应该将其放置在最后一条,以免不会匹配其他的case。指针这条case还有一种简写形式:case let(x,y): 读到这里你是不是会觉得swift语言真是灵活多变呢?别急,更多变的还在后面呢?让我们来看一看下面这段代码吧:

     let origionPoint=(0,0);

     switch origionPoint{

       case let(x,y) where x==y:

       println("x equal y");

      case let(x.y) where x==-y:

       println("x equal -y");

      case let(x,y):

       println("get x and y");

    }

看到这段代码,你是不是想说:“哈哈哈,小样你是不是搞错了,我还没有见过其他语言里面case后面还可以加where的”,但是我想说的是:没错,在swift里面你要习惯这种突入袭来的惊喜。

    下面让我们来接触控制传递语句:break,continue,return,fallthrough,对于break,continue,return我不想多说了,跟其他语言里面的作用是一样的。break结束整个循环,continue结束当前本次循环,return即使返回。但是fallthrough是swift里面所特有的,前面不是说过switch语句在swift里面具有不可贯穿性吗?那么来看下面这段代码:

    var condition:String="hello";

     switch condition {

     case "hello":

       println("xiao");

       fallthrough;

    case "xiao","cai":

      println("xiaocai");

    }

没错fallthrough读作”贯穿“,就是当我匹配到一条case之后,我不希望程序结束switch语句,我希望它继续匹配下一条case,明白了吧!这就是为什么在swift里面允许相同的case缘故了。再来看一段代码:

   Tip:while 3<4{

    switch "hello"{

     case "xiao","cai":

     continue Tip;

    }

   }

这段代码就跟其他语言里面的goto语句差不多,不解释了。

     好了,这篇博客就到这里了,有时间还会继续更新的(保留版权/著作权)。

原文地址:https://www.cnblogs.com/xiaocai20091687/p/3854852.html