在Swift开关中提取值

时间:2017-06-25 14:11:50

标签: swift swift3 pattern-matching

是否可以在Swift模式匹配并同时提取初始值(现在转换)?

例如,如果我有这些枚举:

enum Inner {
    case a(Int)
    case b(Int)
}

enum Outer {
    case one
    case two(Inner)
}

我希望匹配Outer.two(Inner.a(1))并同时对其进行变量

let value: Any // Could be anything :|

switch value {
case let a as Outer.two(Inner.a(1)):
     // Do something which needs `a`
default"
    // Do some other things
}

显然,这不起作用,因为as只会转换为类型。

我也试过

case Outer.two(let a) where a == Inner.a(1):
case let Outer.two(.a(1)) = a: // i.e. the syntax in "guard case let ..."

不起作用。 (注意,第一个会起作用,但实施==对我来说不是一个选择,令人讨厌)

仅供参考:Scala允许您使用@运算符执行此操作,如下所示:

case a @ Outer.two(Inner.a(1)):

是否有可以执行此操作的语法,或者我是否需要重新考虑如何解决我的问题?

1 个答案:

答案 0 :(得分:0)

我认为没有相同的模式 斯威夫特的case a @ Outer.two(Inner.a(1)):。这是可能的 解决方法:

switch value {
case Outer.two(Inner.a(1)):
    let a = Inner.a(1)
    // Do something which needs `a`
default:
    // Do some other things
}