zoukankan      html  css  js  c++  java
  • 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语句差不多,不解释了。

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

  • 相关阅读:
    STL容器[26]
    SHELL[01]
    SHELL[04]
    SHELL[02]I/O重定向
    STL容器[39]
    stl.set用法总结
    STL容器[33]
    STL容器[29]
    hdu acm1071
    hdu acm 2673
  • 原文地址:https://www.cnblogs.com/xiaocai20091687/p/3854852.html
Copyright © 2011-2022 走看看