从枚举中获取关联值而不使用switch / case

时间:2015-07-29 11:03:22

标签: swift enums

我有一些不同类型的枚举,例如

enum X {
    case AsInt(Int)
    case AsDouble(Double)
}

我可以switch就这些问题做好准备就可以恢复基础价值。但是,switch语句非常烦人,试图让我为其他我不关心的案例执行一些代码。例如,现在我有类似

的东西
func AsInt(x: X) -> Int? {
    switch x {
    case AsInt(let num):
        return num;
    default:
        return nil;
    }
}

这样可行,但总是必须引用此方法并且必须为每个枚举的每个案例编写一个新方法,这非常繁琐。我正在寻找的是如何简单地尝试将X类型的值转换为其中一个案例,例如

var object: X = func();
let value = obj as? Int;
if value {
    // do shit
}

我怎样才能简单地检查一个案例而不必枚举我不关心的所有案例并为他们执行一些非陈述?

可以将value声明为条件的一部分而不是污染范围的任何解决方案的加分点。

2 个答案:

答案 0 :(得分:11)

实际上有多种方法可以做到。

让我们通过使用计算属性扩展你的枚举来实现它:

enum X {
    case asInt(Int)
    case asDouble(Double)

    var asInt: Int? {
        // ... see below
    }
}

if case

的解决方案

let在外:

var asInt: Int? {
    if case let .asInt(value) = self {
        return value
    }
    return nil
}

内置let

var asInt: Int? {
    if case .asInt(let value) = self {
        return value
    }
    return nil
}

guard case

的解决方案

let在外:

var asInt: Int? {
    guard case let .asInt(value) = self else {
        return nil
    }
    return value
}

内置let

var asInt: Int? {
    guard case .asInt(let value) = self else {
        return nil
    }
    return value
}

最后一个是我个人最喜欢的四种解决方案的语法。

答案 1 :(得分:7)

从Swift 2(Xcode 7)开始,这可以通过if/case和。{ 模式匹配:

let x : X = ...
if case let .AsInt(num) = x {
    print(num)
}

num的范围仅限于if语句。