天天看點

Swift控制流For循環While循環條件分支控制轉移提前退出檢查API可用性其他

Swift提供了所有大家熟悉的控制流文法,其中包含多重循環的while和for循環;根據一定條件執行不同分支的if、guard和switch文法;以及控制流程轉移的break和continue。

除此之外,Swift在for循環的基礎上,增加了for-in循環。for-in循環可以快速幫你提取數組内的元素,同樣支援字典、字元串以及其他集合。

swift的switch文法是非常強大的。它使得流程更加清晰化,讓我想到了強大的AOP架構。在swith中的每個case,你不需要使用break傳回,它是自動執行break操作的,不會執行下一個case内的代碼。同時switch還支援其他強大的功能,如間隔比對、元祖比對、區域比對、臨時綁定常量比對以及比對時使用where做增加比對。

For循環

Swift中的for循環提供了兩種常用的模式,for-in和for

- for-in在周遊的過程中,能幫你快速提取元組中的對象;

- for和其他開發語言的for一樣,中間三個條件,用“;”分割。

For-In

// MARK: for-in循環
private func testForIn() {
    // 直接循環提取内部資料
    // [1,5]
    for index in . {
        print("\(index) times 5 is \(index * 5)")
    }
    // 不需要提取資料,隻需要循環次數
    let base = 
    let power = 
    var answer = 
    for _ in ..power {
        answer *= base
    }
    print("\(base) to the power of \(power) is \(answer)")
    // array周遊
    let array = ["陽君", "937447974"]
    for item in array {
        print("array:\(item)!")
    }
    // Dictionary周遊
    let dict = ["name":"陽君", "qq":"937447974"]
    for (key, value) in dict {
        print("key:\(key);value:\(value)")
    }
}
           

For

For的一般結構如下所示:

Swift控制流For循環While循環條件分支控制轉移提前退出檢查API可用性其他

例子代碼如下:

// MARK: - 傳統for循環
private func testFor() {
    for var index = ; index < ; index++ {
        print("index is \(index)")
    }
}
           

While循環

While循環執行其内部的代碼,直到條件為假。wihile提供了兩種循環模式:

- while是先執行條件判斷後執行内部代碼;

- repeat-while是先執行内部代碼後執行條件判斷。

While

結構圖:

Swift控制流For循環While循環條件分支控制轉移提前退出檢查API可用性其他
// MARK: - While循環
private func testWhile() {
    // 先執行while條件判斷,後執行内部代碼
    let count = 
    var index = 
    while index < count {
        index++
        print("while:\(index)")
    }
}
           

Repeat-While

結構圖:

Swift控制流For循環While循環條件分支控制轉移提前退出檢查API可用性其他
// MARK: repeat-while循環
private func testRepeatWhile() {
    // 執行内部代碼後判斷條件
    let count = 
    var index = 
    repeat {
        index++
        print("RepeatWhile:\(index)")
    } while index < count
}
           

條件分支

條件分支主要用于在特定的條件執行不同的代碼。當一個情況發生時,你可能想運作額外的代碼,要做到這一點你就需要使用條件分支。

當你想在代碼中使用條件分支時,Swift提供了兩種文法if和switch。通常情況下你可以使用if來做普通的條件判斷,當你的應用場景複雜化時可以是switch來代碼分支。

If

if後跟的條件為真時,執行括号内的代碼,否則跳過。

// MARK: if 判斷
private func testIf() {
    // 一個條件一個條件的判斷,當條件為真時,執行内部程式
    let temp = 
    if temp <=  {
        // 不執行
    } else if temp >=  {
        print("執行")
    } else {
        // 不執行
    }
}
           

Switch

Switch使用一個值去case比對幾種可能,當比對成功時,執行其内部代碼。結構圖:

Swift控制流For循環While循環條件分支控制轉移提前退出檢查API可用性其他
// MARK: swich判斷
private func testSwitch() {
    // 基本switch,case不會穿透。
    let someCharacter: Character = "a"
    switch someCharacter {
    case "a":
        print("1")
    case "a", "b", "c":
        print("2") //這裡不會輸出,case找到後,執行完畢就傳回
    default:
        print("未找到")
    }
}
           

範圍比對

如同刻度尺,switch可以幫助你快速讓一個點落到一個刻度尺範圍内。它還可以幫你落到一個時間間隔内。

private func testSwitchIntervalMatching() {
    // 範圍選擇
    let approximateCount = 
    switch approximateCount {
    case .<:
        print("[1, 5)")
    case .<:
        print("[5, 10)")
    default:
        print("未找到")
    }
}
           

元組

在switch中你還可以使用元組比對,如坐标點(1,1)。如果你隻想比對y,不關心x的值,你可以使用

(_)

,也就是比對

(1,_)

// MARK: switch元組選擇
private func testSwitchTuples() {
    // 元組選擇,坐标軸測試
    let random = arc4random()// 随機數
    let somePoint = (Int(random%3), Int(random%3))// 随機數擷取點
    switch somePoint {
    case (, ):
        print("(0, 0) is at the origin")
    case (_, ):
        print("(\(somePoint.0), 0) is on the x-axis")
    case (, _):
        print("(0, \(somePoint.1)) is on the y-axis")
    case (-., -.):
        print("(\(somePoint.0), \(somePoint.1)) is inside the box")
    default:
        print("(\(somePoint.0), \(somePoint.1)) is outside of the box")
    }
}
           

值綁定

當你使用元組比對,而不關心比對時的某個值,但你想拿到比對成功的值,就可以使用值綁定,并用let聲明的屬性去獲得這個值。

// MARK: switch值選擇
private func testSwitchValueBindings() {
    let random = arc4random()// 随機數
    // 值綁定,如果設定未知數,當比對成功時,執行此代碼
    let anotherPoint = (Int(random%), Int(random%))
    switch anotherPoint {
    case (let x, ):
        print("\(x),x比對")
    case (, let y):
        print("\(y),y比對")
    case let (x, y):
        print("(\(x), \(y)),其他")
    }
}
           

值綁定和Where

在值綁定時,我們可以用where給未知數設定條件,當符合這個條件并且值綁定成功後才會執行内部語句。

// MARK: switch值綁定和where
private func testSwitchValueBindingsWhere() {
    // 使用where條件二次判斷
    let random = arc4random()// 随機數
    let yetAnotherPoint = (Int(random%), Int(random%))
    switch yetAnotherPoint {
    case let (x, y) where x < y:
        print("\(x) < \(y)")
    case let (x, y) where x > y:
        print("\(x) > \(y)")
    case let (x, y):
        print("\(x) = \(y)")
    }
}
           

控制轉移

控制轉移可以幫助你改變代碼執行的順序。在swift中,控制轉移有5種文法:

- continue

- break

- fallthrough

- return

- throw

Continue

跳過目前循環,并繼續執行下一次循環。

// MARK: continue
private func testContinue() {
    // 跳過本次循環,繼續執行下次循環
    for index in . {
        if index ==  {
            continue
        }
        print("continue:\(index)")
    }
}
           

Break

Break主要在for循環和switch中使用。在for循環中就是停止for循環,繼續執行for循環體後的代碼;在switch中,break以為着switch代碼塊執行結束,繼續執行switch代碼塊後的代碼。

// MARK: break
private func testBreak() {
    // 跳過目前for或者switch,繼續執行
    for x in . {
        if x ==  {
            break
        }
        print("break-x:\(x)")
    }
    print("break-for")
    let z = 
    switch z {
    case :
        break;
    default:
        break;
    }
    print("break-switch")
}
           

Fallthrough

在swift中switch的case内的代碼執行完畢後,預設執行break操作,這就意味着,你無法同時執行兩個case内的代碼。當你執行完畢一個case内的代碼後,還想執行下一個case内的代碼,就需要使用fallthrough(擊穿)。

// MARK: fallthrough
private func testFallthrough() {
    // 擊穿:執行目前case内的代碼,并執行下一個case内的代碼
    let x = Int(arc4random())// 0
    switch x {
    case:
        print("0")
        fallthrough
    case :
        print("1")
        fallthrough
    default:
        break;
    }
}
           

标簽

在swift中,使用标簽聲明的代碼塊,在其内部你可以快速使用break停止這個标簽體,或使用continue重新執行這個标簽内的代碼。

// MARK: 标簽
private func testLabeledStatements() {
    // 标簽語句,可以直接跳到寫标簽行的代碼
    var b = false
    go : while true {
        print("go")
        switch b {
        case true:
            print("true")
            break go // 跳過go标簽的代碼
        case false:
            print("false")
            b = true
            continue go // 繼續執行go标簽的代碼
        }
    }
}
           

提前退出

Guard文法和if很類似,在if中,當條件為true時執行其内部代碼。guard和else合用,與if的差異性在于當條件為true跳過内部代碼;條件為false時執行内部代碼。

// MARK: - 提前退出
private func testEarlyExit() {
    // guard和if很像,當條件判斷為假時,才執行else中的代碼
    func greet(person: [String: String]) {
        guard let name = person["name"] else {
            print("無name")
            return
        }
        print("name: \(name)!")
    }

    greet([:])
    greet(["name": "陽君"])
}
           

檢查API可用性

當你在swift中使用IOS9新增加的代碼,而使用者的手機使用的系統是IOS8時。程式運作到此處app會閃退,這是很不好的使用者體驗。swift根據這種情況,增加了使用者版本判斷工具#available()。

// MARK: - 檢查API可用性
private func testCheckingAPIAvailability() {
    if #available(iOS 9.1, OSX 10.10, *) {
        print("iOS 9.1, OSX 10.10, *")
    } else {
        print("低版本")
    }
}
           

其他

參考資料

The Swift Programming Language (Swift 2.1)

文檔修改記錄

時間 描述
2015-10-26 根據 The Swift Programming Language (Swift 2.1)總結

版權所有:http://blog.csdn.net/y550918116j

上一篇: Array數組