在if语句中展开多个选项

时间:2014-07-03 08:44:38

标签: swift optional

我想在一个if语句中解包两个选项,但是编译器在操作符密码常量后抱怨了一个预期的表达式。 可能是什么原因?

    if let email = self.emailField?.text && let password = self.passwordField?.text
    {
        //do smthg
    }

完成Swift。

8 个答案:

答案 0 :(得分:131)

好消息。现在, Swift 1.2 (XCode 6.3 beta,2015年2月9日发布)支持在一行中展开多个选项。

不再需要tuple / switch模式匹配。它实际上非常接近您原来建议的语法(感谢收听,Apple!)

if let email = emailField?.text, password = passwordField?.text {

}

另一件好事是你还可以为{"守卫条件添加where":

var email: String? = "baz@bar.com"
var name: String? = "foo"

if let n = name, e = email where contains(e, "@") {
  println("name and email exist, email has @")
}

参考:XCode 6.3 Beta Release Notes

答案 1 :(得分:41)

Swift 3更新:

if let email = emailField?.text, let password = passwordField?.text {
}

每个变量现在必须以 let 关键字

开头

答案 2 :(得分:24)

如何将选项包装在元组中并使用开关进行模式匹配?

switch (self.emailField?.text, self.passwordField?.text) {
case let (.Some(email), .Some(password)):
    // unwrapped 'email' and 'password' strings available here
default:
    break
}

这肯定有点吵闹,但至少它也可以与 where 子句结合使用。

答案 3 :(得分:9)

用法

if let x = y {
}

不等于

if (let x = y) { // this is actually not allowed
}

"如果让"实际上是一个双字关键字,相当于

if y != nil {
    let x = y!
    // rest of if let block
}

答案 4 :(得分:5)

在Swift 1.2之前

与@James一样,我也创建了一个unwrap函数,但是这个函数使用现有的if let来控制流,而不是使用闭包:

func unwrap<T1, T2>(optional1: T1?, optional2: T2?) -> (T1, T2)? {
  switch (optional1, optional2) {
  case let (.Some(value1), .Some(value2)):
    return (value1, value2)
  default:
    return nil
  }
}

这可以这样使用:

if let (email, password) = unwrap(self.emailField?.text, self.passwordField?.text)
{
  // do something
}

来自:https://gist.github.com/tomlokhorst/f9a826bf24d16cb5f6a3

请注意,如果您想要处理更多案例(例如,当 }时>

答案 5 :(得分:2)

Swift 4

if let suggestions = suggestions, let suggestions1 = suggestions1 {

        XCTAssert((suggestions.count > suggestions1.count), "TEST CASE FAILED: suggestion is nil. delete sucessful");
}

答案 6 :(得分:1)

我无法解释为什么上述代码无效,但这可能是一个很好的替代品:

if let email = self.emailField?.text 
{
    if let password = self.passwordField?.text 
    {
        //do smthg
    }
}

答案 7 :(得分:0)

根据@ Joel的回答,我创建了一个辅助方法。

func unwrap<T, U>(a:T?, b:U?, handler:((T, U) -> ())?) -> Bool {
    switch (a, b) {
    case let (.Some(a), .Some(b)):
        if handler != nil {
            handler!(a, b)
        }
        return true
    default:
        return false
    }
}

//用法

unwrap(a, b) {
    println("\($0), \($1)")
}