Swift的这个成语很有道理
if let x = someDict[someKey] { ... }
但是,我 真正 想要的是
if let x = someDict[someKey], y = someDict[someOtherKey] { ... }
如所写,这不是不正确的,但是这个想法可行吗?
Swift 1.2更新
从Swift 1.2开始,if let允许展开多个可选选项,因此您现在可以编写此代码,如示例所示:
if let
if let x = someDict[someKey], y = someDict[someOtherKey] { … }
您甚至可以交错条件,例如:
if let x = someDict[someKey] where x == "value", y = someDict[someOtherKey] { … }
以前在Swift 1.2之前有效
这是在没有难看的强制包扎的情况下的方法:
switch (dict["a"], dict["b"]) { case let (.Some(a), .Some(b)): println("match") default: println("no match") }
实际上,它仍然很冗长。
之所以Type?可行Optional<Type>,是因为表单的可选类型实际上是的简写形式,它是一个大致如下所示的枚举:
Type?
Optional<Type>
enum Optional<T> { case None case Some(T) }
然后,您可以像其他任何枚举一样使用模式匹配。
编辑: 我见过人们写这样的帮助器函数(对不起归因,我不记得我在哪里看到的):
func unwrap<A, B>(a: A?, b: B?) -> (A, B)? { switch (a, b) { case let (.Some(a), .Some(b)): return (a, b) default: return nil } }
然后,您可以继续使用if let构造,即像这样:
if let (a, b) = unwrap(dict["a"], dict["b"]) { println("match: \(a), \(b)") } else { println("no match") }