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 有哪些新特性[译]》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值