Swift 語言入門(三)控制流程 by Appletone | CodeData
top

Swift 語言入門(三)控制流程

分享:

Swift 語言入門(二)變數與常數 << 前情

控制流程

  • if
  • for 與 for-in
  • while 與 do while
  • switch
  • 控制轉移語句 (control transfer statements)

if

if 在程式開發,條件判斷很常用,用來判斷 是 或 否 兩種狀態。 例如字串變數,是否為空字串,數字是否大於零。

if 語法範例:

if z > b {
    // 做些利大於弊的事
}

if 條件判斷需加上另外的狀態處理,則用 else,例如:

if str == "" {
    // 這裡處理 空字串流程
}
else {
    // 這裡處理 非空字串
}

if、else if、else 綜合範例:

if (index > 0) { // if 條件語句可括號
    "index 大於 0"
}
else if index == 0 { // if 條件語句可不括號
    "index 等於 0"
}
else {
    "index is 為負數"
}

for 與 for-in

for 迴圈 是用來訪問連續的資料,例如你有一筆名冊的資料,想要把每個名字都印出來,就會需要它!

for 語法格式:

for 初始值; 條件描述; 遞增或遞減值 {
    // 條件成立 則進入此段程式
}

範例:

for var i = 0; i < 3; i++ {
    println("var i is \(i)")
}

log 輸出 =>
var i is 0
var i is 1
var i is 2

for 變數存著尋訪每個在字串的字元 in 字串 範例:

for char in "Swift" {
    println(char)
}

log 輸出 =>
S
w
i
f
t

for-in 陣列

for 變數存著尋訪每個在陣列的元素 in 陣列 範例:

let languages = ["Swift", "Objective-C", "Ruby", "Java"]

for lang in languages {
    println(lang)
}

log 輸出 =>
Swift
Objective-C
Ruby
Java

for-in Range

也可以使用 Range 形態,例如:1..<5(代表 1 到 5,不包含 5),範例如下:

for i in 1..<5 {
    println("range in \(i)")
}

log 輸出 =>
range in 1
range in 2
range in 3
range in 4

for-in 字典

當然強大的 for-in 語句,也支援常用的字典型態,搭配 Tuples(元組,多個元素的組合),讓尋訪字典內的 key, value 變得相當直覺!範例如下:

let nums = ["one": 1, "two": 2, "three": 3]
for (str, num) in nums {
    println("\(str) is \(num)")
}

=>
one is 1
two is 2
three is 3

while 與 do while

while 迴圈與 for 迴圈類似,但 while 迴圈會重複執行他的程式區塊,直到條件為 否。

while 語法格式:

// while
while 條件 {
    // 執行程式區塊
}

// do while
do
{
    // 執行程式區塊
} while (條件)

while

舉個例子,假設我們有個變數 decrease 帶著數值 3,在 while 迴圈內一直遞減,while 條件 大於 0,所以 decrease 在大於 0 之前,while 迴圈 都會一直被執行。

var decrease = 3
while decrease > 0
{
    println("decrease \(decrease)")
    --decrease
}

=>
decrease 3
decrease 2
decrease 1

do while

迴圈語句用於,不論如何,迴圈先執行再說,後面 while 條件在來決定要不要繼續執行迴圈。範例如下:

var increase = 0
do
{
    println("increase \(increase)")
    ++increase
} while (increase < 3)

=>
increase 0
increase 1
increase 2

Switch

前面介紹過 if 判斷式,switch 也是判斷式,不過是對於數值的連續判斷,當我們用了很多的 if 或 else if 判斷式時,或許是我們考慮該使用 switch 的時機。

switch 語法格式:

switch 變數 {
    case 比較的數值:
        // 數值一樣時,執行的區塊
    default:
        "其他數值"  
}

Switch 數值判斷

let count = 3
switch count {
    case 1:
        println("one")
    case 2:
        println("two")
    case 3:
        println("three")
    default:
        println("other value")
}

=> three

Switch 字串

switch 語句也支援字串。

var name = "Apple"
switch name {
    case "Apple":
        println("Hi Apple!")
    case "iPhone":
        println("Hi iPhone!")
    default:
        println("請問你叫什麼名字?")
}
=>
Hi Apple!

Switch 多數值 case 判斷

let number = 8
switch number {
    case 1, 3, 5, 7, 9:
        println("奇數")
    case 2, 4, 6, 8, 10:
        println("偶數")
    default:
        println("其他數值")
}

=> 偶數

Switch 使用 Tuple

let point = (1,2)
switch point {
    case (0,0):
        println("原始起點")
    case (_, 0):
        println("x=任意值, y=0")
    case (0, _):
        println("x=0, y=任意值")
    case (1,2):
        println("坐標 1, 2")
    default:
        println("其他坐標")
}
=>
坐標 1, 2

switch 的 where 條件與 數值綁定 (Value Bindings)

Swift 語言的強大 switch 語句還可針對條件作判斷,例如下方範例 where x==y,並且將傳入的變數綁定到變數 x, y,如let (x,y)

let anotherPoint = (5,5)
switch anotherPoint {
    case let (x,y) where x==y:
        println("正方形")
    default:
        println("矩形")
}

=>
正方形

Switch in Range

switch 當然也支援 Range 型別。

var num = 9
switch num {
    case 0...9:
        println("個位")
    case 10...99:
        println("十位")
    case 100...999:
        println("百位")
    default:
        println("其他")
}

=>
個位

Switch Enum

在此我們可以看到 Swift語言,對於 Objective-C 的 Enums 修正了冗長的變數名稱,例如改以 .North 點描述,省略了 CompassPoint

enum CompassPoint {
    case North
    case South
    case East
    case West
}

var direction = CompassPoint.South
switch direction {
    case .North:
        println("北邊")
    case .East:
        println("東邊")
    case .West:
        println("西邊")
    case .South:
        println("南邊")
}

=>
南邊

標簽語句

整段的執行結果,尋訪 names 陣列,並且尋訪每個元素的字元,遇到 小寫 a 字元時,跳 (break) 下個元素。

let names = ["Anna", "Alex", "Brian", "Jack"]
var result = ""
nameLoop: for name in names {
    charLoop: for char in name {
        theSwitch: switch char {
            case "a": // 只要遇到 小寫 a,就結束 charLoop
                break charLoop

            default:
                result += char
        }
    }
}
println(result)

=>
AnnAlexBriJ

控制轉移語句 (control transfer statements)

控制轉移語句 (control transfer statements)能讓我們撰寫控制流程時,自由的決定程式要往哪邊跑,Swift 語言有四種控制轉移語句。

  • continue
    • 在回圈內使用,continue後的內容跳過,並且將繼續執行回圈。
  • break
    • 在 迴圈 與 while 內使用,將會使程式跳離迴圈。注意與 continue 的差異。
  • fallthrough (貫穿)
    • 在 switch 語句中使用,因 Swift 語言,不需在 case 寫 break,若有特殊情況需要 fallthrough (貫穿) 兩種或以上的 case 時用到。
  • return
    • 函式回傳,在執行函式時,若要將運算變數回傳,需使用 return,return 也可回傳 Tuples (元組)。

我們往下來看範例:

continue

在 i > 5 之前,都直接把 i 印出,之後呢 加上字串,並且使用 continue 結束這回合,但迴圈還沒結束。

for i in 1...10 {
    if i > 5 {
        println("continue \(i)")
        continue
    }
    println(i)
}

=>
1
2
3
4
5
continue 6
continue 7
continue 8
continue 9
continue 10

break

break 脫離迴圈,在 i > 5 的時候,使用 break 結束這個迴圈。

for i in 1...10 {
    if i > 5 {
        println("break \(i)")
        break
    }
    println(i)
}

=>
1
2
3
4
5
break 6

fallthrough

因為 integerToDescribe 是 Int,所以它一定是數字,但未必是質數,如果是質數,則 fallthrough 到 default,因為質數也是數字。

let integerToDescribe = 5
var integerDescription = "\(integerToDescribe) 是"
switch integerToDescribe
    {
case 2, 3, 5, 7, 11, 13, 17, 19:
    integerDescription += " 質數, 也是"
    fallthrough

default:
    integerDescription += " 數字"
}
println(integerDescription)

=>
5 是 質數, 也是 數字

return

函式回傳的一些用法,直接回傳數值或變數,亦可回傳 Tuples。

func sayHelloWorld() -> String
{
    return "Hello World"
}

// return with Tuple
func http404Error() -> (Int, String)
{
    return (404, "Not Found")
}

後續 >> Swift 語言入門(四)標準函式

分享:
按讚!加入 CodeData Facebook 粉絲群

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

熱門論壇文章

熱門技術文章