Swift-控制流(control-Flow)-条件语句

目录:

  • if
  • guard
  • switch
  • 控制转移语句
  • 带标签语句
  • 检测API可用性

1. if

同OC一样,只不过条件体不需要括号括起来

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

2. guard

此语法最好的地儿就是''提前退出''
一个guard语句总有一个else从句,如果条件不为真,则执行else从句代码.若条件为真,则执行guard大括号后面的代码
注意:
如果条件不被满足,在else分支上的代码就会被执行。这个分支必须转移控制以退出guard语句出现的代码段。它可以用控制转移语句如return,break,continue或者throw做这件事,或者调用一个不返回的方法或函数,例如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

当有可能有较多时,我们用switch语句。通常与枚举关联较多,我们可以把条件作为枚举值,然后用switch进行判断,这样可读性很高.

  • Swift 与Int型枚举值结合使用演示
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
         */
    }
}
  • 复合匹配

Swift与Int型枚举值结合使用演示(将两个值组合成一个匹配),就是在两个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与元祖结合使用.列害了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("当类型为视频,做些视频该做的事儿",videoId)
        case Type.live:
            print("当=类型为直播,做些直播该做的事儿")
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
}
  • 记得适当的时候我们也可以用where (结合坐标图,看代码)
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
坐标图

4.控制转移语句

  • continue
    停止本次循环,立即执行下次循环
  • break
    立刻结束整个控制流的执行。当在循环体中时,执行跳出循环体,停止循环。当在switch语句中时,执行跳出switch条件判断。
  • fallthrough
    fallthrough,让 case 之后的语句会按顺序继续运行,且不论条件是否满足都会执行。
  • return
    终断代码继续往下执行,这个函数会立刻返回.
  • throw
    throw来抛出一个错误并使用throws来表示一个可以抛出错误的函数。如果在函数中抛出一个错误,这个函数会立刻返回并且调用该函数的代码会进行错误处理(我会自Swift-错误处理中介绍)

5.带标签语句

label name: while condition { statements }

while循环有一个标签名"gameLoop"代表游戏循环的主循环

gameLoop: while square != finalSquare {
    diceRoll += 1
    if diceRoll == 7 { diceRoll = 1 }
    switch square + diceRoll {
    case finalSquare:
        // 骰子数刚好使玩家移动到最终的方格里,游戏结束。
        break gameLoop
    case let newSquare where newSquare > finalSquare:
        // 骰子数将会使玩家的移动超出最后的方格,那么这种移动是不合法的,玩家需要重新掷骰子
        continue gameLoop
    default:
        // 合法移动,做正常的处理
        square += diceRoll
        square += board[square]
    }
}

6.检测API可用性

最后一个参数,*,是必须的,用于指定在所有其它平台中,如果版本号高于你的设备指定的最低版本,if语句的代码块将会运行。

if #available(platform name version, ..., *) {
APIs 可用,语句将执行
} else { APIs 不可用,语句将不执行
}


```swift
if #available(iOS 10, macOS 10.12, *) {
    // 在 iOS 使用 iOS 10 的 API, 在 macOS 使用 macOS 10.12 的 API
} else {
    // 使用先前版本的 iOS 和 macOS 的 API
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,841评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,415评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,904评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,051评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,055评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,255评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,729评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,377评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,517评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,420评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,467评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,144评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,735评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,812评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,029评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,528评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,126评论 2 341

推荐阅读更多精彩内容