这个Swift的成语很有道理
if let x = someDict[someKey] { ... }
Run Code Online (Sandbox Code Playgroud)
但是,我真正想要的是
if let x = someDict[someKey], y = someDict[someOtherKey] { ... }
Run Code Online (Sandbox Code Playgroud)
如上所述,这不是错误的,但这个想法可能吗?
Jea*_*let 29
Swift 1.2的更新
从Swift 1.2开始,if let允许解包多个选项,所以你现在可以像在你的例子中一样编写它:
if let x = someDict[someKey], y = someDict[someOtherKey] { … }
Run Code Online (Sandbox Code Playgroud)
您甚至可以交错条件,例如:
if let x = someDict[someKey] where x == "value", y = someDict[someOtherKey] { … }
Run Code Online (Sandbox Code Playgroud)
这曾经在Swift 1.2之前有效
这是你如何在没有丑陋的力量上行的情况下做到这一点:
switch (dict["a"], dict["b"]) {
case let (.Some(a), .Some(b)):
println("match")
default:
println("no match")
}
Run Code Online (Sandbox Code Playgroud)
实际上还是很啰嗦.
这是有效的,因为表单的可选类型Type?实际上是简写Optional<Type>,这是一个看起来大致如下的枚举:
enum Optional<T> {
case None
case Some(T)
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将模式匹配用于任何其他枚举.
编辑:我见过人们写这样的辅助函数(抱歉缺少归因,我不记得我在哪里看到它):
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
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以继续使用if let构造,就像这样:
if let (a, b) = unwrap(dict["a"], dict["b"]) {
println("match: \(a), \(b)")
} else {
println("no match")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9890 次 |
| 最近记录: |