閱讀397 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Swift中的循環語句

循環語句能夠使程序代碼重複執行。Swift編程語言支持4種循環構造類型:while、do while、for和for in。for和while循環是在執行循環體之前測試循環條件,而do while是在執行循環體之後測試循環條件。這就意味著for和while循環可能連一次循環體都未執行,而do while將至少執行一次循環體。for in是for循環的變形,它是專門為集合遍曆而設計的。
一、while語句
while語句是一種先判斷的循環結構,格式如下:
while 循環條件 {
    語句組 
}
while循環沒有初始化語句,循環次數是不可知的,隻要循環條件滿足,循環就會一直進行下去。
下麵看一個簡單的示例,代碼如下:
var i:Int64 = 0


while i * i < 100000 {
    i++
}


println("i = \(i)")
println("i * i = \(i * i)")


輸出結果如下:
i = 317
i * i = 100489
上述程序代碼的目的是找到平方數小於100 000的最大整數。使用while循環需要注意幾點,while循環條件語句中隻能寫一個表達式,而且是一個布爾型表達式,那麼如果循環體中需要循環變量,就必須在while語句之前對循環變量進行初始化。示例中先給i賦值為0,然後在循環體內部必須通過語句更改循環變量的值,否則將會發生死循環。
提示 死循環對於單線程程序而言是一場災難,但是在多線程程序中,死循環是必需的,死循環會出現在子線程中。例如遊戲設計中對玩家輸入裝置的輪詢,或是動畫程序的播放,都是需要死循環的。下麵的代碼是死循環的一般寫法。
while true { 
    語句組  
}


提示 循環是比較耗費資源的操作,如何讓開發人員測試和評估循環效率呢?Xcode 6提供的Playground工具可以幫助我們實現這個目的。在Playground界麵中打開時間軸。打開Playground界麵後運行代碼,如下圖所示,程序運行過程中會在右邊時間軸繪製出一條線段,橫軸是經曆的時間,縱軸是i值變化,我們在執行完成後拖曳線段,查看運行曆史中i值內容。就本例而言,時間軸中的線段越陡,執行的效率越高。



二、do while語句
do while語句的使用與while語句相似,不過do while語句是事後判斷循環條件結構,語句格式如下: 
do {
  語句組 
} while 循環條件
do while循環沒有初始化語句,循環次數是不可知的,不管循環條件是否滿足,都會先執行一次循環體,然後再判斷循環條件。如果條件滿足則執行循環體,不滿足則停止循環。
下麵看一個示例代碼:
var i:Int64 = 0


do{
    i++
} while  i * i < 100000


println("i = \(i)")
println("i * i = \(i * i)")


輸出結果如下:
i = 317
i * i = 100489
該示例與上一節的示例是一樣的,都是找到平方數小於100 000的最大整數。輸出結果也是一樣的。
三、for語句
for語句是應用最廣泛、功能最強的一種循環語句。一般格式如下: 
for 初始化; 循環條件; 迭代 {
  語句組
}
當程序執行到for語句時,會先執行初始化語句,它的作用是初始化循環變量和其他變量,然後程序會查看循環條件是否滿足,如果滿足,則繼續執行循環體並計算迭代語句,之後再判斷循環條件,如此反複,直到判斷循環條件不滿足時跳出循環。終止語句一般用來改變循環條件,它可對循環變量和其他變量進行操作。 
以下示例代碼是計算1~9的平方表程序: 
println("n   n*n")
println("---------")
for var i = 1; i < 10; i++  {
    println("\(i) x \(i) = \(i * i)")
}


輸出結果如下:
n   n*n
---------
1 x 1 = 1
2 x 2 = 4
3 x 3 = 9
4 x 4 = 16
5 x 5 = 25
6 x 6 = 36
7 x 7 = 49
8 x 8 = 64
9 x 9 = 81
在這個程序的循環部分初始時,給循環變量i賦值為1,每次循環都要判斷i的值是否小於10,如果為true,則執行循環體,然後給i加1。因此,最後的結果是打印出1~9的平方,不包括9。 
初始化、循環條件以及迭代部分都可以為空語句(但分號不能省略),三者均為空的時候,相當於一個無限循環。
for ; ;  {
    ......
}
在初始化部分和迭代部分,可以使用逗號語句來進行多個操作。逗號語句是用逗號分隔的語句序列,如下程序代碼所示:
var x:Int32
var y:Int32


for x = 0, y = 10; x < y; x++, y--  {
    println("(x,y) = (\(x),\(y))")
}


輸出結果如下:
(x,y) = (0,10)
(x,y) = (1,9)
(x,y) = (2,8)
(x,y) = (3,7)
(x,y) = (4,6)
四、for in語句
Swift提供了一種專門用於遍曆集合的for循環——for in循環。使用for in循環不必按照for的標準套路編寫代碼,隻需要提供一個集合就可以遍曆。
假設有一個數組,原來遍曆數組的方式如下:
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


println("----for-------")
for var i = 0; i < countElements(numbers); i++ {
    println("Count is: \(i)")
}


輸出結果如下:
Count is: 0
Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9
上述語句let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]聲明並初始化了10個元素數組集合,目前大家隻需要知道當初始化數組時,要把相同類型的元素放到[…]中並且用逗號分隔(,)即可,關於數組集合我們會在第10章詳細介紹。
采用for in循環語句遍曆數組的方式如下:
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];


println("----for in----")
for item in numbers {
    println("Count is: \(item)")
}


輸出結果如下:
Count is: 0
Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9

從上例可以發現,item是循環變量,item之前使用var聲明,它是隱式變量聲明的。in後麵是集合實例,for in循環語句會將後麵集合中的元素一一取出來,保存到item中。可見for in語句在遍曆集合的時候要簡單方便得多。但是對於其他操作,for in循環就不太適合了。


更多內容請關注國內第一本Swift圖書《Swift開發指南》
本書交流討論網站:https://www.51work6.com/swift.php
歡迎加入Swift技術討論群:362298485

歡迎關注智捷iOS課堂微信公共平台





最後更新:2017-04-03 05:40:20

  上一篇:go Hibernate聯合主鍵
  下一篇:go Hibernate的session中的flush