繁体   English   中英

从没有 switch/case 的枚举中获取关联值

[英]Get associated value from enumeration without switch/case

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

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声明为条件的一部分而不是污染范围的解决方案的奖励积分。

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

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

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
}

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

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

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

num的范围仅限于 if 语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM