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