在if语句中展开多个选项

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

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

在Swift中完成。

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

没有更多的元组/开关模式匹配需要。 它实际上非常接近你原来的build议语法(感谢听,苹果!)

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

另一个好处是你也可以添加一个“守卫条件”:

 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版本说明

Swift 3的更新:

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

每个variables现在都必须以let关键字开头

如何将可选项包装在一个元组中并使用切换到模式匹配?

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

这绝对有点吵,但至less它也可以与where子句结合使用。

用法

 if let x = y { } 

不等于

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

“如果让”实际上是一个两个字的关键字,相当于

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

在Swift 1.2之前

就像@James一样,我也创build了一个unwrap函数,但是这个函数使用现有的控制stream而不是使用闭包:

 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

注意,如果你想处理更多的情况(比如当两个字段之一零),你最好用switch语句。

我无法解释为什么上面的代码不起作用,但这将是一个很好的替代:

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

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

 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)") }