美文网首页Swift编程
使用 guard 来改善你的条件判断

使用 guard 来改善你的条件判断

作者: 码农UP2U | 来源:发表于2020-01-24 22:43 被阅读0次

    今天学了 极客时间张杰 老师的 Swift,今天看的内容是 guard 关键字,说实话感觉暂时没有感觉出来它的好处。

    guard

    • guard 语句,类似于 if 语句,基于不二之表达式来执行语句。使用guard 语句来要求一个条件必须是真才能执行 guard 之后的语句。与 if 语句不通,guard 语句总是有一个 else 分之 —— else 分句里的代码会在条件不为真的时候执行。
    • 当编写条件语句的时候,左边的代码间距应该是一个“黄金”或者“快乐”的大道。这是说,不要嵌套 if 语句。多个 return 语句是 OK 的。这样可以避免圈复杂度(Cyclomatic Complexity),并且让代码更加容易阅读。因为你的方法的重要部分没有嵌套在分支上,你可以很清楚地找到相关的代码。

    检查 api 的可用性

    这是 guard 关键字使用的实例

    • Swift 拥有内置的对 API 可用性的检查功能,它能够确保你不会悲剧地使用了对部属目标不可 用的 API。
    • 你可以在 if 或者 guard 语句中使用一个可用性条件来有条件地执行代码,基于在运行时你想 用的哪个 API 是可用的。

    示例

    课程中讲了一个反例,反例如下:

    func isIpAddress(ipString: String) -> (Int, String) {
        let components = ipString.split(separator: ".")
        
        if components.count == 4 {
            if let first = Int(components[0]), first >= 0 && first <= 255 {
                if let second = Int(components[1]), second >= 0 && second <= 255 {
                    if let third = Int(components[2]), third >= 0 && third <= 255 {
                        if let fourth = Int(components[3]), fourth >= 0 && fourth <= 255 {
                            return (0, "ip 地址合法")
                        } else {
                            return (4, "ip 地址第四部分不对")
                        }
                        
                    } else {
                        return (3, "ip 地址第三部分不对")
                    }
                } else {
                    return (2, "ip 地址第二部分不对")
                }
            } else {
                return (1, "ip 地址第一部分不对")
            }
        } else {
            return (100, "ip 地址必须有四部分")
        }
    }
    
    print(isIpAddress(ipString: "127.0.0.1"))
    

    看到反例的写法以后,又给出了使用 guard 关键字解决的方法,代码如下:

    func isIpAddress1(ipString: String) -> (Int, String) {
        let components = ipString.split(separator: ".")
        
        guard components.count == 4 else {
            return (100, "ip 地址必须有四部分")
        }
        
        guard let first = Int(components[0]), first >= 0 && first <= 255  else {
            return (1, "ip 地址第一部分不对")
        }
        
        guard let second = Int(components[1]), second >= 0 && second <= 255 else {
            return (2, "ip 地址第二部分不对")
        }
        
        guard let third = Int(components[2]), third >= 0 && third <= 255 else {
            return (3, "ip 地址第三部分不对")
        }
        
        guard let fourth = Int(components[3]), fourth >= 0 && fourth <= 255 else {
            return (4, "ip 地址第四部分不对")
        }
        
        return (0, "ip 地址合法")
    }
    
    print(isIpAddress1(ipString: "127.0.0.1"))
    

    说实话,我真没感觉到它的好用之处,对于第一个反例,通常我们也不会那样写代码,通常我们的写法是:

    func isIpAddress(ipString: String) -> (Int, String) {
        let components = ipString.split(separator: ".")
        
        if components.count != 4 {
            return (100, "ip 地址必须有四部分")
        }
    
        if () {
        }
    

    也就是让尽早的不合理提早的返回,其实 guard 也是这样做了。所以,没有太多的体会到 guard 的用法。



    我的微信公众号:“码农UP2U”

    相关文章

      网友评论

        本文标题:使用 guard 来改善你的条件判断

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