何时在“where”条件中执行可选 - 展开if语句?

时间:2015-02-22 19:23:21

标签: swift

Swift 1.2增加了在单个if语句中展开多个选项的功能,以及同时测试条件的能力:

if let a = optionalA, b = optionalB where a.foo == b.bar && a.frob == b.nicate {
    // unwrapping successful
}

这引入了一个双层次的条件:只有当选项成功解包时,评估才会向前移动,并且只有在满足每个条件时才会向前移动。那么我的问题是它们是如何交错的?在if声明中评估条件的时间是什么时候?

我问,因为我想做这样的事情:

if let b = foo(i - 1) where i > 0 {
    // code
}

在此示例中,如果使用负值调用foo,则会产生有害的副作用。

1 个答案:

答案 0 :(得分:2)

目前看来,where子句在之后被称为,所有if let检查都是在没有nil的情况下完成的。为了更深入地了解它是如何工作的,我建议Nate Cooks博客。他在this blogpost上提到了这一点。

  

使用新语法,依次评估每个绑定,停止if   任何尝试的绑定都是零。 仅在所有可选项之后   绑定是成功的是检查where子句

所以看起来你必须按照之前的方式进行i > 0检查,然后再进行解包。