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语句差不多,不解释了。

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

上一篇:Android AsyncTask异步任务(二)


下一篇:使用Hexo搭建github博客步骤,超简便