swift:入门知识之控制流

1、swift语句中的控制流和其他语言大致相同,使用if和switch作为条件控制。使用 for-in、for、while、do-while作为循环。

2、区别之处:小括号不是必须的,但是主体的大括号还是必需的,,,,

3、在if语句中,条件必须是布尔表达式,这意味着if score{...}是错误的,不能隐含的与0比较

4、可以一起使用if和let来防止值的丢失。这些值是可选的。可选的值包含一个值或者包含一个nil来指定值还存不存在。写一个问号"?"在类型后表示值是可选的。

5、在switch-case语句中,switch可以接收任何类型的变量或语句作为条件,不再限制于字符类型、整型等,在一条语句结束后,不需要再写上break,但是最后的defalut不能省略。switch的每一个case至少有一条语句,不允许后面跟一个空语句。

6、可以在循环中保持一个索引,通过".."来表示索引范围或明确一个初始值、条件、增量。用"..<"表示不算上边界,用"..."表示算上边界

7、在控制流中有一个新的类型元组,它可以同时存放很多的值,可以通过"元组名.索引"来获取其中值,也可以遍历获取。当然也可以通过键或者函数获取。

 

具体举例如下:

类型后面带一个?代表前面如果是nil就执行后面的部分,如果不是nil,后面就不执行,表示后面的数据是可选的

var name:String? = "Tom"
name == nil     //false

 在if中使用let temp = name,如果temp是nil,后面不执行,相反则执行

//name = nil
if let temp = name{
    println("hello \(temp)")  //"hello Tom"
}

传统for循环语句,不需要小括号

//传统for循环
let array = [1,2,3,4,5]
var sum1 = 0
for var i = 0; i<5; i++
{
    sum1 += array[i]
}
sum1  //输出结果

高级for循环,不需要小括号,判断时的条件必须是布尔类型,需要是具体的算数逻辑或关系逻辑 如>、<、==

//高级for循环
let Allscore = [80,87,90,60,45]
var sum = 0
for eachscore in Allscore{
    if eachscore > 50  //使用关系判断的比较方式作为判断条件
{ sum += 1 } else { sum += 3 } } sum //输出结果

采用.代替省略的索引,使用..<表示不包括边界,如果包含边界,使用...

//不包括索引5
for
j in 0..<5{ sum1 += array[j] } sum1 //输出结果

swicth后的表达式可以是各种类型

case后面可以根很多种情况

case后面用let x where 进行分类

case后面不能用break

defalut不能省略

var color = "lightgray"
var commment = ""
switch color
    {
case "red":
    commment = "激情"
case "green","blue":
    commment = "忧郁"
case let x where x.hasSuffix("gray"):
    commment = "灰色心情-\(x)"
default:
    commment = "其他心情"
}
commment    //输出结果

新类型元组的使用,可以存放多个值,通过"元组.索引"获取值,也可以遍历获取

//新类型:元组
var tuples = ("Tom",22)
tuples.0 = "Jobs" //获取元组中第一个值
tuples.1 = 23     //获取元组中第二个值
println(tuples)

//元组使用
let dictionary = [
    "Prime":[2,3,5,7,11,13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
//通过for高级循环遍历元组中的数据 for (kind,numbers) in dictionary{ for number in numbers{ if largest < number{ largest = number } } } largest //输出最大值

where循环语句,也是不用使用小括号了

//where语句的使用(明显的区别就是不适用()括号了)
//方式一
var num = 1
while num < 10{
    num = num * 2
}
num
//方式二 var tempNum = 1 do{ tempNum = tempNum * 2 }while tempNum < 10 tempNum

 

switch语句拓展:

不存在隐式的贯穿(Fallthrough)
与C语言和Objective-C中的switch语句不同,在 Swift 中,当匹配的case块中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个case块。这也就是说,不需要在case块中显式地使用break语句。这使得switch语句更安全、更易用,也避免了因忘记写break语句而产生的错误。

 

多个模式

 

范围匹配
case块的模式也可以是一个值的范围。下面的例子展示了如何使用范围匹配来输出任意数字对应的自然语言格式:
 
控制转移语句
控制转移语句改变你代码的执行顺序,通过它你可以实现代码的跳转。Swift有四种控制转移语句。 
- continue
- break
- fallthrough
- return(留在函数中介绍)
 
Continue
continue告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。就好像在说“本次循环迭代我已经执行完了”,但是并不会离开整个循环体。
 
Break
break语句会立刻结束整个控制流的执行。当你想要更早的结束一个switch代码块或者一个循环体时,你都可以使用break语句。
在Switch代码块中使用Break:
当在一个switch代码块中使用break时,会立即中断该switch代码块的执行,并且跳转到表示switch代码块结束的大括号(})后的第一行代码。
􏴂􏳠􏰬􏴸􏴹􏰰􏰲􏴤􏶀􏶁􏰰􏶂􏵠􏴂􏰬
Fallthrough
Swift语言中的switch不会从上一个case分支落入到下一个case分支中。相反,只要第一个匹配到的case分支完成了它需要执行的语句,整个switch代码块完成了它的执行。相比之下,C语言要求你显示的插入break语句到每个switch分支的末尾来阻止自动落入到下一个case分支中。Swift语言的这种避免默认落入到下一个分支中的特性意味着它的switch 功能要比C语言的更加清晰和可预测,可以避免无意识地执行多个case分支从而引发的错误。
 
元组 (Tuple)
你可以使用元组在同一个switch语句中测试多个值。元组中的元素可以是值,也可以是范围。另外,使用下划线(_)来匹配所有可能的值。
 
值绑定 (Value Bindings)
case块的模式允许将匹配的值绑定到一个临时的常量或变量,这些常量或变量在该case块里就可以被引用了——这种行为被称为值绑定。
 
Where
case块的模式可以使用where语句来判断额外的条件。
 
Labeled Statements
在Swift语言中,你可以在循环体和switch代码块中嵌套循环体和switch代码块来创造复杂的控制流结构。然而,循环体和switch代码块两者都可以使用break语句来提前结束整个方法体。因此,显示地指明break语句想要终止的是哪个循环体或者switch代码块,会很有用。类似地,如果你有许多嵌套的循环体,显示指明continue语句想要影响哪一个循环体也会非常有用。
为了实现这个目的,你可以使用标签来标记一个循环体或者switch代码块,当使用break或者continue时,带上这个标签,可以控制该标签代表对象的中断或者执行。产生一个带标签的语句是通过在该语句的关键词的同一行前面放置一个标签,并且该标签后面还需带着一个冒号。
下面是一个标签的使用范例:
posted @ 2015-10-22 21:34  XYQ全哥  阅读(434)  评论(0编辑  收藏  举报