What's New in Swift 2 —— guard关键词

前端之家收集整理的这篇文章主要介绍了What's New in Swift 2 —— guard关键词前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、前言

本文主要介绍Swift 2新特性,里边的guard关键词。请看下面两个方法,一个good,一个bad。为什么用guard的那个方法就是good的呢?

// Good
func fooNonOptionalGood(x: Int) {
    guard x > 0 else {
        // x 不大于零
        return
    }

    // x 大于零
}

// bad
func fooNonOptionalBad(x: Int) {
    if x <= 0 {
        // x 不大于零
        return
    }

    // x 大于零
}

二、解释

1、关键词“guard”是什么

// 如果不符合“x > 0”,即x <= 0,则执行花括号。
guard x > 0 else {
    // some Syntax
    return
}

第一次看到guard的时候,就会让人觉得,“诶,为什么要用 guard,用 if 不是好了吗?因为 guard 和 if 功能差不多呀,改成“if x <= 0”不就可以了吗,干嘛大费周章弄一个guard?

2、深入发掘

看一个判断正数的例子:

func fooPositiveCheck(x: Int?) {
    // 不是正数
    if x == nil || x <= 0 {
        print("不是正数")
        return
    }

    // 是正数
    print("是正数")
    x!.description
}

这是OC最基本的判断方法,看起来没什么问题,很不错的写法呀~

但是,有两个缺点:

1、我们是判断“正数”,但是上面的方法是在判断“不是正数”的情况下,返回。如果这样的语句多了的话,容易令人困惑,因为明明想判断正数,但非要反过来,判断不是正数,然后返回。

2、如果是正数,还要解包optional的值x。(x!)


Swift 早期已经提供了Optional Binding(绑定):

func fooBinding(x: Int?) {
    if let x = x where x > 0 {
        print("是正数")
        x.description
    }

    print("不是正数")
}

上面的Swift方法解决了之前OC那个方法的两个缺点,但同时产生了另一个新的缺点:

——把你想实现的代码写在了判断嵌套里面,而不是外边;如果这样的语句多了,容易令人产生困惑。


解决新产生的缺点,那么来看看Swift 2 中的guard关键词,会有怎样的效果

func fooGuard(x: Int?) {
    guard let x = x where x > 0 else {
        print("不是正数")
        return
    }

    print("是正数")
    // 自动解包(不用x!)
    x.description
}

用 guard 解决了以上的三个缺点:

1、判断:你想要的,而不是:不想要的。[判断正数:想要的——正数(x>0);不想要的——非正数(x<=0)];

2、自动解包;

3、检查判断在前,使得你的方法更合理,也更容易地维护。

三、参考文章

ecerney:《Swift Guard Statement》

其他文章
Greg Heo:《What’s New in Swift 2》
jopen:《Swift 2 有哪些新特性[译]》

猜你在找的Swift相关文章