在上一篇博客里面,我谈到了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语句差不多,不解释了。
好了,这篇博客就到这里了,有时间还会继续更新的(保留版权/著作权)。