美文网首页Swift 集
Swift 中 guard 和 if 小结

Swift 中 guard 和 if 小结

作者: Swift社区 | 来源:发表于2022-09-02 16:01 被阅读0次

    共同点

    都是用于流程控制的关键字,都能做到满足条件做某事,不满足条件做另外一件事

    语法

    if的简单使用

    if !name.isEmpty {
        doSomething()
    } else {
        show("名字是空")
    }
    

    gaurd的简单使用

    guard !name.isEmpty else {
        show("名字是空")
        return
    }
    doSomething()
    
    • 从语法特点上来看,if满足条件要执行的代码放在前面的闭包内,不满足条件要执行的代码放在else的闭包内;guard不满足条件要执行的代码放在else的闭包内,满足条件要执行的代码放在guard语句的后面,不用放在guard的任何闭包中

    • guard有一个很大的特点,在else闭包中必须跟一个中断往后执行的关键字或者方法等,如return、continue、break、fatalError、throw等,这里有些同学有一个很大的误区,认为else闭包里只能用return

    什么时候适合用guard

    1、多个optional解包,并且需要都满足条件,比如做登录功能的时候

    使用if做的两种方式: 方式1:

    if let username = usernameTextField.text, !username.isEmpty {
        if let password = passwordTextField.text, !password.isEmpty {
            register(username, password)
        } else {
            show("密码不能为空")
        }
    } else {
        show("用户名不能为空")
    }
    

    方式2:

    if let username = usernameTextField.text, !username.isEmpty, let password = passwordTextField.text, !password.isEmpty {
        register(username, password)
    } else {
        show("用户名和密码不能为空")
    }
    

    这两种方式的缺点:方式1中存在多重嵌套,如果不止用户名和密码,还有其他的,嵌套更深;方式2中if后面跟的语句过长,不方便阅读和理解,结构不清楚

    使用guard怎么做:

    guard let username = usernameTextField.text, !username.isEmpty else {
        show("用户名不能为空")
        return
    }
    
    guard let password = passwordTextField.text, !password.isEmpty else {
        show("密码不能为空")
        return
    }
    register(username, password)
    

    使用guard结构清晰,方便阅读和理解,并且不造成嵌套

    2、中断当前流程,当不满足条件时,不需要执行后面的逻辑,比如校验手机号码是否正确

    使用if

    func verifyMobilePhoneNumber(_ phoneNumber: String) -> Bool {
        if phoneNumber.isEmpty {
            return false
        }
        /// 检验逻辑。。。
    }
    

    使用guard

    func verifyMobilePhoneNumber(_ phoneNumber: String) -> Bool {
        guard !phoneNumber.isEmpty {
            return false
        }
        
        /// 检验逻辑。。。
    }
    

    if、guard都能满足功能,但是guard的优势就在于,看到guard 中的条件,就知道不满足条件,就要中断当前流程,而使用if,还要去看if对应闭包的内容,才能判断是否中断流程,这里例子简单,看不出太多优势,当逻辑比较复杂后,guard在这里的优势就体现出来了

    什么时候用if,而不能用guard

    当满足条件做某事,然后继续做后面的事,比如打扫卫生,张三扫地,然后拖地,李四檫黑板,然后拖地,其他同学拖地

    func cleanClassroom(name: String) {
        if name == "张三" {
            sweepTheFloor()
        }
        
        if name == "李四" {
            cleanTheBlackboard()
        }
        
        mopTheFloor()
    }
    

    很明显这里只能用if,不能用guard

    总结

    guard的优势在于,else闭包中必须使用中断当前流程的语句,并且满足条件要执行的代码不用放在guard的任何闭包中 使用guard能解决一些if嵌套问题和一些if代码不便于阅读理解和结构不清晰的问题

    相关文章

      网友评论

        本文标题:Swift 中 guard 和 if 小结

        本文链接:https://www.haomeiwen.com/subject/flqzoktx.html