使用带有许多表达式的"if let ..."

Mar*_*wie 22 swift

这个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)

  • 你可以(稍微)使用`case let(.Some(a),.Some(b))缩短它:` (3认同)