Swift-控制流(control-Flow)-條件語句

目錄:

  • if
  • guard
  • switch
  • 控制轉(zhuǎn)移語句
  • 帶標(biāo)簽語句
  • 檢測API可用性

1. if

同OC一樣饼酿,只不過條件體不需要括號括起來

        let a = 0
        if a > 0 {
            
        } else if a == 0 {
            
        } else {
            
        }

2. guard

此語法最好的地兒就是''提前退出''
一個guard語句總有一個else從句,如果條件不為真稚晚,則執(zhí)行else從句代碼.若條件為真在抛,則執(zhí)行g(shù)uard大括號后面的代碼
注意:
如果條件不被滿足,在else分支上的代碼就會被執(zhí)行眉踱。這個分支必須轉(zhuǎn)移控制以退出guard語句出現(xiàn)的代碼段。它可以用控制轉(zhuǎn)移語句如return,break,continue或者throw做這件事,或者調(diào)用一個不返回的方法或函數(shù)脚粟,例如fatalError()

class ViewController: UIViewController {
    
    enum Sections: Int {
        case student = 0
        case teacher
        case dog
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let section = 2
        
        guard Sections.dog.rawValue == section else {
            print("條件不為真,走這里了")
            return
        }
        print("條件為真蘸朋,走這里了")
        
    }
}

按需使用guard,會提高我們代碼的可讀性核无,所以,要巧用

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        buy(product: ["name":"衣服"])
        /*輸出
         我想買: 衣服
         在什么位置買買買
         */

        buy(product: ["name":"衣服","location" : "南京西路"])
        /*輸出
         我想買: 衣服
         我去 南京西路 買 衣服
         */
    }
    
    private func buy(product:[String : String]) {
        guard let name = product["name"] else {
            return
        }
        print("我想買:",name)

        guard let location = product["location"] else {
            print("在什么位置買買買")
            return
        }
        
        print("我去",location,"買",name)
    }
}

3. switch

當(dāng)有可能有較多時藕坯,我們用switch語句团南。通常與枚舉關(guān)聯(lián)較多,我們可以把條件作為枚舉值炼彪,然后用switch進行判斷吐根,這樣可讀性很高.

  • Swift 與Int型枚舉值結(jié)合使用演示
class ViewController: UIViewController {
    enum Sections: Int {
        case student
        case teacher
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        // 不存在隱士貫穿,所以不需要在case 后加break
        let section = 0
        switch section {
        case Sections.student.rawValue:
            print("嘿辐马,student拷橘,section = ", Sections.student.rawValue)
        case Sections.teacher.rawValue:
            print("嘿,eacher,section = ", Sections.teacher.rawValue)
        default: break
        }
        /* 輸出
         嘿冗疮,tudent萄唇,section =  0
         */
    }
}
  • 復(fù)合匹配

Swift與Int型枚舉值結(jié)合使用演示(將兩個值組合成一個匹配),就是在兩個case間加一個,即可

class ViewController: UIViewController {
    
    enum Sections: Int {
        case student = 0
        case teacher
        case dog
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let section = 2
        
        switch section {
        case Sections.student.rawValue, Sections.dog.rawValue:
            if Sections.student.rawValue == section {
                print("嘿,Student术幔,section = ",Sections.student.rawValue)
            } else {
                print("嘿另萤,Dog,section = ",Sections.dog.rawValue)
            }
        case Sections.teacher.rawValue:
            print("嘿诅挑,teacher四敞,section = ",Sections.teacher.rawValue)
        default: break
        }
        
        /* 輸出
         嘿,Dog拔妥,section =  2
         */
    }

}
  • 牛點來了啊忿危,Swift與元祖結(jié)合使用.列害了world哥
// 視頻需要Id,直播不需要
enum Type {
    case video(id: Int)
    case live
}


class TwoViewController: UIViewController {
    
    convenience init(type: Type) {
        self.init()

        switch type {
        case Type.video(id: let videoId):
            print("當(dāng)類型為視頻,做些視頻該做的事兒",videoId)
        case Type.live:
            print("當(dāng)=類型為直播毒嫡,做些直播該做的事兒")
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
}
  • 記得適當(dāng)?shù)臅r候我們也可以用where (結(jié)合坐標(biāo)圖癌蚁,看代碼)
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}
// 輸出 "(1, -1) is on the line x == -y
坐標(biāo)圖

4.控制轉(zhuǎn)移語句

  • continue
    停止本次循環(huán),立即執(zhí)行下次循環(huán)
  • break
    立刻結(jié)束整個控制流的執(zhí)行兜畸。當(dāng)在循環(huán)體中時努释,執(zhí)行跳出循環(huán)體,停止循環(huán)咬摇。當(dāng)在switch語句中時伐蒂,執(zhí)行跳出switch條件判斷。
  • fallthrough
    fallthrough,讓 case 之后的語句會按順序繼續(xù)運行肛鹏,且不論條件是否滿足都會執(zhí)行逸邦。
  • return
    終斷代碼繼續(xù)往下執(zhí)行,這個函數(shù)會立刻返回.
  • throw
    throw來拋出一個錯誤并使用throws來表示一個可以拋出錯誤的函數(shù)。如果在函數(shù)中拋出一個錯誤在扰,這個函數(shù)會立刻返回并且調(diào)用該函數(shù)的代碼會進行錯誤處理(我會自Swift-錯誤處理中介紹)

5.帶標(biāo)簽語句

label name: while condition { statements }

while循環(huán)有一個標(biāo)簽名"gameLoop"代表游戲循環(huán)的主循環(huán)

gameLoop: while square != finalSquare {
    diceRoll += 1
    if diceRoll == 7 { diceRoll = 1 }
    switch square + diceRoll {
    case finalSquare:
        // 骰子數(shù)剛好使玩家移動到最終的方格里缕减,游戲結(jié)束。
        break gameLoop
    case let newSquare where newSquare > finalSquare:
        // 骰子數(shù)將會使玩家的移動超出最后的方格芒珠,那么這種移動是不合法的桥狡,玩家需要重新擲骰子
        continue gameLoop
    default:
        // 合法移動,做正常的處理
        square += diceRoll
        square += board[square]
    }
}

6.檢測API可用性

最后一個參數(shù)皱卓,*裹芝,是必須的,用于指定在所有其它平臺中娜汁,如果版本號高于你的設(shè)備指定的最低版本嫂易,if語句的代碼塊將會運行。

if #available(platform name version, ..., *) {
APIs 可用掐禁,語句將執(zhí)行
} else { APIs 不可用怜械,語句將不執(zhí)行
}


```swift
if #available(iOS 10, macOS 10.12, *) {
    // 在 iOS 使用 iOS 10 的 API, 在 macOS 使用 macOS 10.12 的 API
} else {
    // 使用先前版本的 iOS 和 macOS 的 API
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颅和,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缕允,更是在濱河造成了極大的恐慌融虽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灼芭,死亡現(xiàn)場離奇詭異,居然都是意外死亡般又,警方通過查閱死者的電腦和手機彼绷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茴迁,“玉大人寄悯,你說我怎么就攤上這事《橐澹” “怎么了猜旬?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長倦卖。 經(jīng)常有香客問我洒擦,道長,這世上最難降的妖魔是什么怕膛? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任熟嫩,我火速辦了婚禮,結(jié)果婚禮上褐捻,老公的妹妹穿的比我還像新娘掸茅。我一直安慰自己,他們只是感情好柠逞,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布昧狮。 她就那樣靜靜地躺著,像睡著了一般板壮。 火紅的嫁衣襯著肌膚如雪逗鸣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天个束,我揣著相機與錄音慕购,去河邊找鬼。 笑死茬底,一個胖子當(dāng)著我的面吹牛沪悲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阱表,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼殿如,長吁一口氣:“原來是場噩夢啊……” “哼贡珊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涉馁,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤门岔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烤送,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寒随,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年帮坚,在試婚紗的時候發(fā)現(xiàn)自己被綠了妻往。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡试和,死狀恐怖讯泣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阅悍,我是刑警寧澤好渠,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站节视,受9級特大地震影響拳锚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肴茄,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一晌畅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寡痰,春花似錦抗楔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贞滨,卻和暖如春入热,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晓铆。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工勺良, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骄噪。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓尚困,卻偏偏與公主長得像,于是被迫代替她去往敵國和親链蕊。 傳聞我的和親對象是個殘疾皇子事甜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容