Swift 4.0學(xué)習(xí)之旅—控制流

 override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //函數(shù)流
        //Swift 提供了多種流程控制結(jié)構(gòu),包括可以多次執(zhí)行任務(wù)的while循環(huán),基于特定條件選擇執(zhí)行不同代碼分支的if,guard和switch語(yǔ)句  還有控制流程跳轉(zhuǎn)到其他代碼位置的break 和continue語(yǔ)句
        
        //Swift 還提供了for,in 用來(lái)更簡(jiǎn)單的遍歷數(shù)組array  字典dictionary ,區(qū)間range 字符串集string 和其他序列類型  Set
        
        //Swift的switch語(yǔ)句比c語(yǔ)言中更加強(qiáng)大,case 還可以匹配很多不同的模式,包括范圍匹配,元組tuple和特定類型匹配,switch的case中匹配的值可以聲明為臨時(shí)常量或變量,在case作用域內(nèi)使用,也可以配合where 來(lái)描述更復(fù)雜的匹配條件
        //for in循環(huán) 可以使用forin 循環(huán)來(lái)遍歷一個(gè)集合中的所有元素,例如數(shù)組中的元素,范圍內(nèi)的數(shù)字或者字符串中的字符
        
        let names = ["nihao","hellp","world"]
        for str in names{
            print(str)
        }
        
        let  dict = ["a":"1","b":"2","c":"3"]
        //遍歷字典
        for (key,value) in dict{
            print("\(key) : \(value)")
        }
        
        //若按順序遍歷字典 沒(méi)有多大意義 多數(shù)用在傳參
        //若順序遍歷  如果key是 中文 那就借助三方庫(kù)
        for key in dict.keys.sorted(){
            print("\(key) = \(dict[key])")
        }
        
        //使用 ... 表示一個(gè)區(qū)間,從0 到 5   ...表示閉區(qū)間操作符
        for num in 0...5{
            print(num)
        }
        
        //使用..<  表示從開(kāi)始位置到 小于的數(shù) 不包含小于的數(shù)
        for  num in 0..<10{
            print(num)
        }
        
        for index in 1...5 {
            print("\(index) times 5 is \(index * 5)")
        }
        //在例子中,index 是一個(gè)每次循環(huán)遍歷開(kāi)始時(shí)被自動(dòng)賦值的常量,這種情況下,index 在使用前不需要聲明,只需要將它包含在循環(huán)聲明中,就可以對(duì)其進(jìn)行隱式聲明,而無(wú)需使用let關(guān)鍵字聲明
        
        //如果只單純的想用下循環(huán) 來(lái)干別的變量的事 則不需要?jiǎng)?chuàng)建默認(rèn)常量, 使用 (_)來(lái)替代變量名忽略這個(gè)值
        let base = 3
        let num = 1
        var result = 1
        for _ in 0...num{
            result *= base
        }
        print(result)
        
        //使用stride(form:to:by:)函數(shù)來(lái)跳過(guò)不需要的標(biāo)記 stride跨過(guò),步幅
        let skip = 5
        for num in stride(from: 0, to: 60, by: skip){
            print(num)
        }
        //會(huì)從初始值開(kāi)始
        
        //也可以在閉區(qū)間用 Stride(form:through:by:) 起到同樣作用
        for bun in stride(from: 0, through: 12, by: 3){
            print(bun)
        }
        
        //while 循環(huán)會(huì)一直巡行到一段語(yǔ)句知道條件編程false 。這類循環(huán)適合使用在第一次迭代前,迭代次數(shù)位置的情況下,swift 提供兩種while 循環(huán)形式
        
        //while循環(huán),每次在循環(huán)開(kāi)始時(shí)計(jì)算條件是否符合
        //repeat-while循環(huán),每次在循環(huán)結(jié)束時(shí)計(jì)算條件是否符合
        
        var number = 1;
        while number <= 10 {
            number += 2
            print(number)
        }
        
        let finaly = 25
        var board = [Int](repeating: 0, count: finaly + 1) //這是創(chuàng)建一個(gè)初始數(shù)組啊  學(xué)到了 創(chuàng)建25+1 個(gè) 每個(gè)都是0
        print(board)
        board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
        board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
        
        var square = 0
        var diceroll = 0
        while square < finaly {
            diceroll += 1
            if diceroll == 7 {
                diceroll = 1
            }
            square += diceroll
            
            if square < board.count{
                square += board[square]
            }
        }
        //md  直接給個(gè)棋盤游戲來(lái)解釋說(shuō)明 不清楚游戲的 還真有點(diǎn)懵逼 就是記錄當(dāng)前在多少格 符合定好的點(diǎn) 就加減對(duì)應(yīng)的點(diǎn)的值  直到走到末尾格為止
        
        //Repeat-while   while 循環(huán)的另一種形式是repeat-while  它和while的區(qū)別實(shí)在判斷循環(huán)條件之前,先執(zhí)行一次循環(huán)的代碼塊,然后重復(fù)循環(huán)直到條件為false
        //Swift 語(yǔ)言 repeat-while  與 其他語(yǔ)言中 do-while 循環(huán)是類似的
        
        var counts = 0
    
        repeat{
            counts += 1
        } while counts <= 11
        print(counts)
        
        
//        repeat-while語(yǔ)句 會(huì)比while 語(yǔ)句省去數(shù)組越界的檢查  現(xiàn)在repeat 語(yǔ)句中取出數(shù)組  看情況而定
        
        //swift 提供兩種類型的條件語(yǔ)句  if語(yǔ)句和switch語(yǔ)句,通常,當(dāng)條件較為簡(jiǎn)單且可能的情況很少時(shí)用if語(yǔ)句,而switch語(yǔ)句更適用于條件較復(fù)雜,有更多排列的時(shí)候,并且switch在需要用到模式匹配(pattern-matching)的情況下回更有用
        
        var testnum = 30
        if testnum <= 32{
            print("太簡(jiǎn)單了 就是小于32")
        }
        //如果是真則執(zhí)行第一個(gè)語(yǔ)句
        
        if testnum <= 26{
            print("夏天26度舒適")
        }else if(testnum >= 30){
            print("空調(diào)極限")
        }
        
        //當(dāng)不需要完整判斷情況的時(shí)候,最后的else 語(yǔ)句是可選的
        
        //Switch
        //switch語(yǔ)句會(huì)嘗試把某個(gè)值與若干個(gè)模式進(jìn)行匹配。根據(jù)第一個(gè)匹配陳賡模式 ,switch語(yǔ)句執(zhí)行對(duì)應(yīng)的代碼,當(dāng)有可能的情況較多時(shí),通常用switch 語(yǔ)句替換if語(yǔ)句
        var switchnum = 2
        switch switchnum {
        case 1:
            print("1")
        case 2,
             3:
            print("2||3")
        case 4:
        print("4")
        case 5:
            print("5")
        default:
            break
        }
        //當(dāng)寫完時(shí),發(fā)現(xiàn)警告已經(jīng)告訴我 除了 case 2 3  其他行的打印不會(huì)被執(zhí)行  這判斷能力有點(diǎn)強(qiáng)  直接幫我匹配完了
        //每行不需要寫上break  若多個(gè)匹配用同一個(gè)結(jié)果時(shí),需在條件后加,逗號(hào)來(lái)隔開(kāi)再 :冒號(hào)匹配
        
        //switch 語(yǔ)句由多個(gè)case 構(gòu)成,每個(gè)由case 關(guān)鍵字開(kāi)始,為了匹配某些更特定的值,swift提供了幾種方法來(lái)進(jìn)行更復(fù)雜的模式匹配,這些模式將在本節(jié)的稍后部分提到
        //與if語(yǔ)句類似,每一個(gè)case都是代碼執(zhí)行的一條分支,switch會(huì)決定那一條分支應(yīng)該被執(zhí)行,這個(gè)流程被稱作根據(jù)給定的值切換。
        
        //switch語(yǔ)句必須是完備的,這就是說(shuō),每一個(gè)可能的值都必須至少有一個(gè)case分支與之對(duì)應(yīng),在某些不可能涵蓋所有值得情況下,你可以使用默認(rèn)分支來(lái)涵蓋其它所有沒(méi)有對(duì)應(yīng)的值,這個(gè)默認(rèn)分支必須在switch語(yǔ)句的最后面
        let someCharacter: Character = "z"
        switch someCharacter {
        case "a":
            print("The first letter of the alphabet")
        case "z":
            print("The last letter of the alphabet")
        default:
            print("Some other character")
        }
        
        //若寫了default: 那就得必須寫完整或者不寫任何自己的語(yǔ)句、要寫上break
        //為什么會(huì)翻譯成 不存在隱式的貫穿  很是不理解這個(gè)名字
        //與c 和oc 的switch 語(yǔ)句不同,當(dāng)匹配的case 分支中的代碼執(zhí)行完成后,程序會(huì)終止switch語(yǔ)句,而不會(huì)繼續(xù)執(zhí)行下一個(gè)case 語(yǔ)句,這也就是說(shuō),不需要再case分支中顯式使用break語(yǔ)句。這使得switch語(yǔ)句更安全,更易用,也避免了因忘寫了break語(yǔ)句而產(chǎn)生的錯(cuò)誤。
        //雖然swift中 break 不是必須的,但依然可以寫
        
        //每個(gè)case 分支必須包含一個(gè)語(yǔ)句 若寫了case value: 后面什么也不寫 會(huì)報(bào)錯(cuò)
        //為了讓單個(gè)case 同時(shí)匹配兩個(gè)值,可以將兩個(gè)值組合成一個(gè)符合匹配,并且用逗號(hào)分開(kāi)
        let anotherCharacter: Character = "a"
        switch anotherCharacter {
        case "a", "A": //可以寫在一行里 也可以分行寫以便可讀性
            print("The letter A")
        default:
            print("Not the letter A")
        }
        
        //case 分支模式也可以是一個(gè)值得區(qū)間,下面的例子展示了如何使用區(qū)間匹配來(lái)輸出任意數(shù)字對(duì)應(yīng)的自然語(yǔ)言格式
        
        let casenumber = 31
        let casestr : String
        
        //因?yàn)閏asestr 是沒(méi)有默認(rèn)值,是可選值,若是var 則隨便  若給賦了初始值 則不能匹配
        switch casenumber {
        case 0:
            casestr = "0"
        case 1..<5:
            casestr = "1-5"
        case 5..<20:
            casestr = "5-20"
        case 20..<40:
            casestr = "20-40"
            
        default:
            break
        }
        
        //case 也可以匹配元組  或者元組中的區(qū)間
        //使用 _ 下劃線 來(lái)匹配所有可能的值
        let  somerange = (1,0)
        switch somerange {
        case (0,0):
            print("匹配0,0")
        case (_,0):
            print("匹配 _,0")
        case (0,_):
            print("匹配 0,_")
        case (-2...2,-2...2):
            print("匹配一個(gè)區(qū)間的范圍")
        default:
            break
        }
        
        //值綁定
        //case 分支允許將匹配的值聲明為臨時(shí)常量或變量,并且在case分支體內(nèi)使用, -- 這種行為被稱為值綁定(value binding),因?yàn)槠ヅ涞闹翟赾ase 分支體內(nèi),與臨時(shí)的常量或變量綁定
        
        let point = (2,0)
        switch point {
        case (let x ,0):
            print("case first \(x)")
        case (0,let y):
                print("case scond \(y)")
        case let (x,y):
            print("case x=\(x) y = \(y)")
        default:
            break
        }
        //式子中 let x 或者 let y  或者 let(x,y)  可以理解為 _ 匹配任意值, let (_,_)
        
        
        //可以 將上面的式子 理解 寫成下面的式子
        let point1 = (2,0)
        switch point1 {
        case (_ ,0):
            print("case first")
        case (0,_):
            print("case scond")
        case let (_,_):
            print("case all")
            
        //因?yàn)橐呀?jīng)寫出了匹配 所有 就不會(huì)在走 default語(yǔ)句 除非 數(shù)據(jù)項(xiàng)格式不對(duì)
        default:
            break
        }
        
        //case 的分支判斷中 可以使用 Where 來(lái)判斷額外條件
        let testpoint = (1,-1)
        switch testpoint {
        case let (x,y) where x == y: //理解為 匹配所有 并且 x 與 y相等
            print("\(x),\(y) where is x == y")
        case let (x,y) where x == -y: //理解為 匹配所有 并且 x 與 -y相等
            print("\(x),\(y) where is x == -y")
        case let (x, y):            //匹配任何值
            print("(\(x), \(y)) is just some arbitrary point")
        default:
            break
        }
        //一開(kāi)始想著 直接case 判斷語(yǔ)句 下面這語(yǔ)句 既然都知道要匹配的值是真是假了 干嘛還要用匹配很傻缺
        //所以 case 分支 是可以寫成判斷語(yǔ)句的
        let textcode = 1
        var boolvalue : Bool = true
        switch boolvalue {
        case textcode >= 5:
            print("case first")
        case textcode <= 5:
            print("case second")
        default:
            break
        }
        
        var string = "default"
        
        //do sth change string value
        //然后 匹配string 值
        
        //下面的式子是錯(cuò)誤 匹配string  所以case 匹配的表達(dá)式 都應(yīng)該是給一個(gè)string類型的值出來(lái) 不能是別的值 所以還是用where 來(lái)表示
//        switch string {
//        case string.isEmpty:
//            <#code#>
//        default:
//            <#code#>
//        }
        
        //where 后面加判斷 加操作式  但是where 后面還是要跟表達(dá)式
        switch string {
        case let emptyStr where string.isEmpty:
            print("null string")
        case let defaultStr where string == "de":
            print("default")
        case let changeStr where changeStr[...changeStr.index(changeStr.endIndex, offsetBy: -1)] == "default" :
            print("匹配到了 \(changeStr)")
        default:
            break
        }
        //還是要拋棄我這種 亂七八糟的想法
        //理解為 先將let 常量 變?yōu)槠ヅ涞闹担缓竽贸A糠诺?where 后面的判斷語(yǔ)句中,且當(dāng)語(yǔ)句條件為true 是,匹配到的分支才會(huì)被執(zhí)行
        
        //復(fù)合匹配
        let char : Character = "a"

        switch char {
        case "a","b","c":
            print("case first")
        case "a","e","f": //此時(shí)xcode 已經(jīng)給出警告說(shuō) ”a“ 已經(jīng)被判斷過(guò)了,無(wú)序再寫,所以只會(huì)匹配一次
            print("case second")
        default:
            break
        }
        //復(fù)合匹配同樣包含值綁定,
        let yuanzu = (10,10)
        switch yuanzu {
        case (let case1 ,10),(10,let case1):
//        case (let case1 ,10),(10,let case2): //本來(lái)寫成兩種 常量 但是xcode 會(huì)報(bào)錯(cuò) 說(shuō)case1 必須在所有的匹配元素中,意思是復(fù)合匹配的每個(gè)綁定值必須是同一個(gè) 變量或常量的名字  不能重復(fù)的創(chuàng)建
            print("x =\(case1) y = \(case1)")
        default:
            break
        }
        //官方翻譯為 所有的分支體內(nèi) 只要任何一個(gè)匹配 都已獲取到 同樣的命名的值
        
        
        
        
        //控制轉(zhuǎn)移語(yǔ)句
        //包含  continue、break、fallthrough、return、throw
        
        //continue 繼續(xù)  語(yǔ)句會(huì)告訴一個(gè)循環(huán)體like停止本次循環(huán) ,重新開(kāi)始下次循環(huán),就好像在說(shuō) 本次循環(huán)我已經(jīng)執(zhí)行完了,但是并不會(huì)離開(kāi)整個(gè)循環(huán)體
        
        let world = "hello world"
        var character = ""
        for char in world{
            switch char {
            case "a","b","c","d":
                continue
            default:
                character.append(char)
            }
        }
        print(character)
        //使用了continue 就直接跳出循環(huán),不在執(zhí)行后續(xù)代碼,重新下一次循環(huán)。
        
        
        //break   break 語(yǔ)句會(huì)立刻結(jié)束整個(gè)控制流的執(zhí)行,break 可以在switch 或循環(huán)語(yǔ)句中使用,用來(lái)提前結(jié)束switch或循環(huán)語(yǔ)句
        
        //循環(huán)語(yǔ)句中的break  當(dāng)在一個(gè)循環(huán)中使用break 會(huì)立刻中斷該循環(huán)體的執(zhí)行,然后跳轉(zhuǎn)到表示循環(huán)體結(jié)束的大括號(hào)” } “后的第一行代碼,不會(huì)再有本次循環(huán)的代碼被執(zhí)行,也不會(huì)再有下次的循環(huán)產(chǎn)生。
        
        
        //switch 語(yǔ)句中的break
        //當(dāng)在一個(gè)switch 代碼塊中使用break時(shí),會(huì)立即中斷該switch代碼塊的執(zhí)行,并且跳轉(zhuǎn)到表示switch代碼塊結(jié)束的大括號(hào) “}”后的第一行代碼
        //這種特性可以被用來(lái)匹配或者忽略一個(gè)或多個(gè)分支。因?yàn)閟wift的switch需要包含所有的分支,而且不允許有為空的分支,有時(shí)為了使你的意圖更明顯,需要特意匹配或者忽略某個(gè)分支。那么當(dāng)你想忽略某個(gè)分支時(shí),可以在該分支內(nèi)寫上break語(yǔ)句,當(dāng)那個(gè)分支被匹配到時(shí),分支內(nèi)的break語(yǔ)句立即結(jié)束switch 代碼塊
        
        //當(dāng)一個(gè)switch分支僅僅包含注釋時(shí),會(huì)被報(bào)編譯錯(cuò)誤,注釋不是代碼語(yǔ)句而且也不能讓switch 分支打到忽略的效果,你應(yīng)該使用break 來(lái)忽略某個(gè)分支。
        
        let numberSymbol: Character = "三"  // 簡(jiǎn)體中文里的數(shù)字 3
        var possibleIntegerValue: Int?
        switch numberSymbol {
        case "1", "?", "一", "?":
            possibleIntegerValue = 1
        case "2", "?", "二", "?":
            possibleIntegerValue = 2
        case "3", "?", "三", "?":
            possibleIntegerValue = 3
        case "4", "?", "四", "?":
            possibleIntegerValue = 4
        default:
            break
        }
        if let integerValue = possibleIntegerValue {
            print("The integer value of \(numberSymbol) is \(integerValue).")
        } else {
            print("An integer value could not be found for \(numberSymbol).")
        }
        // 輸出 "The integer value of 三 is 3."
        
        
        //貫穿
        //在swift 里,switch 語(yǔ)句不會(huì)從上一個(gè)case 分支跳轉(zhuǎn)到下一個(gè)case分支中,相反,只要第一個(gè)匹配的case分支完成了它所需要執(zhí)行的語(yǔ)句,整個(gè)switch代碼塊完成了它的執(zhí)行,相比之下。c語(yǔ)言要求你顯式的插入break語(yǔ)句到每個(gè)case分支的末尾來(lái)阻止自動(dòng)落入到下一個(gè)case分支.swift的這種避免默認(rèn)落入到下一個(gè)分支中的特性意味著它的switch功能要比c語(yǔ)言的更加清晰和可預(yù)測(cè),可以避免無(wú)意識(shí)的執(zhí)行多個(gè)case分支從而引發(fā)的錯(cuò)誤。
        //如果你確實(shí)需要c風(fēng)格的貫穿的特性,你可以在每個(gè)需要改特性的case 分支中使用fallthrough關(guān)鍵字。下面的例子找那個(gè)使用fallthrough來(lái)創(chuàng)建一個(gè)數(shù)字的描述語(yǔ)句
        
        let numm = 5
        var nummdes = "number \(numm) is"
        switch numm {
        case 5,6,7,8:
            nummdes += "get this"
            fallthrough
        case 5,7,8,9 :
            nummdes += "get second"
        default:
            break
        }
        print(nummdes)
        
        //fallthrough 不會(huì)默認(rèn)執(zhí)行break 結(jié)束整個(gè)switch 語(yǔ)句  會(huì)繼續(xù)走下一個(gè)case 語(yǔ)句 直到走完或者遇到break
        
        //帶標(biāo)簽的語(yǔ)句  在swift中,你可以在循環(huán)和條件語(yǔ)句中嵌套循環(huán)體和條件語(yǔ)句來(lái)創(chuàng)造復(fù)雜的控制流結(jié)構(gòu),并且,循環(huán)體和條件語(yǔ)句都可以使用break語(yǔ)句來(lái)提前結(jié)束整個(gè)代碼塊,因此,顯式的指明break語(yǔ)句想要終止的是哪個(gè)循環(huán)體或者條件語(yǔ)句,會(huì)很有用,類似地,如果你有許多嵌套的循環(huán)體,顯式指明continue語(yǔ)句想要影響哪一個(gè)循環(huán)體也會(huì)非常有用.
        
        //標(biāo)簽 statement label來(lái)標(biāo)記一個(gè)循環(huán)體或者條件語(yǔ)句,對(duì)于一個(gè)條件語(yǔ)句,你可以使用break加標(biāo)簽的方式,來(lái)結(jié)束這個(gè)被標(biāo)記的語(yǔ)句,對(duì)于一個(gè)循環(huán)語(yǔ)句,你可以使用break 或者continue加標(biāo)簽,來(lái)結(jié)束或者繼續(xù)這條被標(biāo)記語(yǔ)句的執(zhí)行
        
        //聲明一個(gè)帶標(biāo)簽的語(yǔ)句是通過(guò)在該語(yǔ)句的關(guān)鍵詞的同一行前面防止一個(gè)標(biāo)簽,作為這個(gè)語(yǔ)句的前導(dǎo)關(guān)鍵字 introducor keyword 并且該標(biāo)簽后面跟隨一個(gè)冒號(hào)
//        label name : while condition { statements}
        
        //意思應(yīng)該為循環(huán)體內(nèi) 嵌套一個(gè)循環(huán)體或者一個(gè)switch 語(yǔ)句  在最外層的主循環(huán)體前加一個(gè)標(biāo)簽 與冒號(hào) 來(lái)代表這個(gè)最外層主要循環(huán)體,然后內(nèi)層的循環(huán)體匹配到一個(gè)條件正好滿足條件,然后要求整個(gè)循環(huán)體結(jié)束,不再執(zhí)行?;蛘咛^(guò)這個(gè) 繼續(xù)下次
        
        let outnum = 11
        let innum = 22
        
        var countnum = 0
        
        outfor:  for i in 0..<4{
            infor: for j in 0..<4{
                countnum = i * 10 + j
                inswitch:  switch countnum {
                            case outnum:
                                print("匹配到了 11 執(zhí)行continue操作 跳過(guò)內(nèi)層for當(dāng)前循環(huán)")
                                continue infor
//                                fallthrough 想著 我只是結(jié)束內(nèi)層循環(huán) 但switch語(yǔ)句還是繼續(xù)走啊 能不能貫穿到默認(rèn)去
                            case innum :
                                print("匹配到了22 結(jié)束整個(gè)外層循環(huán)")
                                break outfor
                            default:
                                break
                            }
                            print("結(jié)束執(zhí)行switch \(countnum)")
                // 打印得出 匹配到了11 后結(jié)束內(nèi)層循環(huán),switch 也停止了,內(nèi)層循環(huán)末尾的打印當(dāng)匹配到11后也沒(méi)有執(zhí)行,直接在匹配到了11 后就沒(méi)再往下走過(guò)。
                //在匹配到了22后也沒(méi)有執(zhí)行內(nèi)層循環(huán)末尾的打印,直接結(jié)束了整個(gè)外層循環(huán)
                
                
                
                    }
                    print(countnum)
                }
        
        //提前退出 想if語(yǔ)句一樣,guard 的執(zhí)行取決于一個(gè)表達(dá)式的布爾值,我們可以使用guard 語(yǔ)句來(lái)要求條件必須為真時(shí),以執(zhí)行g(shù)uard 語(yǔ)句后的代碼,不同于if 語(yǔ)句,一個(gè)guard 語(yǔ)句總是有一個(gè)else 從句,如果條件不為真則執(zhí)行else 從句中的代碼。
        //如果條件不被滿足,在else分支上的代碼就會(huì)被執(zhí)行,這個(gè)分支必須轉(zhuǎn)義控制以退出guard語(yǔ)句出現(xiàn)的代碼段。它可以用控制轉(zhuǎn)義語(yǔ)句如 return,break,continue,或者throw做這件事,或者調(diào)用一個(gè)不反悔的方法或函數(shù),例如fatalerror()
        //相比于可以實(shí)現(xiàn)同樣功能的if語(yǔ)句,按需使用guard 語(yǔ)句會(huì)提升我們代碼的可讀性,它可以使你的代碼連貫的被執(zhí)行 而不需要將它抱在else塊中 。它可以使你在緊鄰條件判斷的地方,處理違規(guī)的情況。
        
        //個(gè)人覺(jué)得可以用在 各種格式判斷上 如手機(jī)號(hào),郵箱,身份證等等正則表達(dá)式上,或者在一個(gè)表單頁(yè)面,很多填寫頁(yè)面做未填寫檢查
        conname(person: ["name":"lili"])
        conname(person:["name":"lili","where":"安徽"])
        conname(person:["noname":"noname"])
        
        //檢測(cè)API可用性
        //swift 內(nèi)置支持檢查API可用性 ,這可以確保我們不會(huì)在當(dāng)前部署機(jī)器上,不小心使用了不可用的API
        //編譯器使用SDK中的可用信息來(lái)驗(yàn)證我們的代碼中使用的所有API 在項(xiàng)目指定的步數(shù)目標(biāo)上是否可用,如果我們嘗試使用一個(gè)不可用的API,SWift會(huì)在編譯時(shí)報(bào)錯(cuò)
        
        //我們?cè)趇f或guard 語(yǔ)句中使用可用性條件,(availablity condition) 去有條件的執(zhí)行一段代碼,來(lái)在運(yùn)行時(shí)判斷調(diào)用的API 是否可用。編譯器使用從可用性條件語(yǔ)句中獲取的信息去驗(yàn)證,在這個(gè)代碼塊中調(diào)用的API 是否可用
        
        if #available(iOS 10, macOS 10.12, *){
            print("支持ios 10 和macOS 10.12")
        
        }else{
            print("不支持")
        }
        
        //在一般形式中,可用性條件使用了一個(gè)平臺(tái)名字和版本的列表,平臺(tái)名字可以使iOS,macOS,watchOS 和tvOS
    }

    
    func conname(person :[String : String]){
        guard let name = person["name"] else {
            print("沒(méi)有名字的你 你好")
            return;
        }
        
        guard let location = person["where"] else {
            print("\(name)不知道你在哪")
            return
        }
        
        print("\(name)  \(location) 天氣怎么樣")
    }

打印為

nihao
hellp
world
b : 2
a : 1
c : 3
a = Optional("1")
b = Optional("2")
c = Optional("3")
0
1
2
3
4
5
0
1
2
3
4
5
6
7
8
9
1 times 5 is 5
2 times 5 is 10
3 times 5 is 15
4 times 5 is 20
5 times 5 is 25
9
0
5
10
15
20
25
30
35
40
45
50
55
0
3
6
9
12
3
5
7
9
11
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
12
太簡(jiǎn)單了 就是小于32
空調(diào)極限
2||3
The last letter of the alphabet
The letter A
匹配 _,0
case first 2
case first
1,-1 where is x == -y
case second
匹配到了 default
case first
x =10 y = 10
hello worl
The integer value of 三 is 3.
number 5 isget thisget second
結(jié)束執(zhí)行switch 0
結(jié)束執(zhí)行switch 1
結(jié)束執(zhí)行switch 2
結(jié)束執(zhí)行switch 3
3
結(jié)束執(zhí)行switch 10
匹配到了 11 執(zhí)行continue操作 跳過(guò)內(nèi)層for當(dāng)前循環(huán)
結(jié)束執(zhí)行switch 12
結(jié)束執(zhí)行switch 13
13
結(jié)束執(zhí)行switch 20
結(jié)束執(zhí)行switch 21
匹配到了22 結(jié)束整個(gè)外層循環(huán)
lili不知道你在哪
lili  安徽 天氣怎么樣
沒(méi)有名字的你 你好
支持ios 10 和macOS 10.12
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 126.析構(gòu)器 在一個(gè)類實(shí)例銷毀前,一個(gè)析構(gòu)器會(huì)立即調(diào)用。使用deinit 關(guān)鍵字來(lái)表示析構(gòu)器, 跟構(gòu)造器寫法類似...
    無(wú)灃閱讀 902評(píng)論 0 4
  • 這個(gè)叫春昇的人讓駱少陽(yáng)感到一陣恐懼。這是一個(gè)活了將近兩百歲的人,為什么容貌還是那么年輕,甚至讓人感覺(jué)不到一絲衰老的...
    望星style閱讀 527評(píng)論 0 0
  • 文字是一個(gè)活生生的人。她表情豐富,情感也豐富,姿態(tài)或詭異或傲嬌或清新可人或魅惑或丑陋的一塌糊涂。 文字是一個(gè)實(shí)體的...
    右二閱讀 921評(píng)論 0 1
  • 當(dāng)代中國(guó)擁有許多文人墨客,像才高八斗的阿城,文筆犀利的王安憶等,但獨(dú)獨(dú)缺了汪曾祺那般的純粹之人。 汪曾祺是誰(shuí)?熟知...
    張漪紋閱讀 736評(píng)論 1 5
  • 分頁(yè)查詢,只有5千條數(shù)據(jù),但因?yàn)樯婕暗降谋肀容^多,所以每次請(qǐng)求大約要8S左右的時(shí)間。 下面講一下優(yōu)化的過(guò)程: 系統(tǒng)...
    YangEvol閱讀 2,220評(píng)論 2 0

友情鏈接更多精彩內(nèi)容