一尘不染

在许多表达式中使用“ if let…”

swift

Swift的这个成语很有道理

if let x = someDict[someKey] { ... }

但是,我 真正 想要的是

if let x = someDict[someKey], y = someDict[someOtherKey] { ... }

如所写,这不是不正确的,但是这个想法可行吗?


阅读 456

收藏
2020-07-07

共1个答案

一尘不染

Swift 1.2更新

从Swift 1.2开始,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>,是因为表单的可选类型实际上是的简写形式,它是一个大致如下所示的枚举:

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