在if语句中展开多个选项

Leo*_*onS 60 optional swift

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

    if let email = self.emailField?.text && let password = self.passwordField?.text
    {
        //do smthg
    }
Run Code Online (Sandbox Code Playgroud)

在Swift完成.

smi*_*lay 131

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

不再需要元组/开关模式匹配.它实际上非常接近你原来建议的语法(感谢收听,Apple!)

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

}
Run Code Online (Sandbox Code Playgroud)

另一个好处是你还可以添加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 @")
}
Run Code Online (Sandbox Code Playgroud)

参考:XCode 6.3 Beta发行说明

  • 应该在swift 3中为每个可选项添加`let`. (6认同)
  • 为什么他们会选择使用逗号(,)代替&&.对于斯威夫特的爱,请停止疯狂! (2认同)

Hen*_*son 43

Swift 3更新:

if let email = emailField?.text, let password = passwordField?.text {
}
Run Code Online (Sandbox Code Playgroud)

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


小智 25

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

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

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


Gri*_*mxn 9

用法

if let x = y {
}
Run Code Online (Sandbox Code Playgroud)

不等于

if (let x = y) { // this is actually not allowed
}
Run Code Online (Sandbox Code Playgroud)

"if let"实际上是一个双字关键字,相当于

if y != nil {
    let x = y!
    // rest of if let block
}
Run Code Online (Sandbox Code Playgroud)

  • 好的,所以这是不可能的,谢谢 (3认同)

Tom*_*rst 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
  }
}
Run Code Online (Sandbox Code Playgroud)

这可以这样使用:

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

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

请注意,如果您想处理更多情况(例如,当两个字段中的一个 nil时),您最好使用switch语句.