我们可以在枚举上使用`if`或`guard`而不是`switch`来提取值吗?

时间:2017-02-28 04:17:03

标签: swift if-statement enums swift3

我定义了一个枚举,我创建了一个计算属性来提取与其中一个案例相关的值。我用switch

写了这个计算
enum NetworkResult<T> {
    case json(T)
    case error(Error)

    var error: Error? {
        switch self {
        case .error(let error):
            return error
        default:
            return nil
        }
    }
}

是否可以在没有任何switch关键字的情况下实现相同的计算属性?(例如,使用if let构造?)

2 个答案:

答案 0 :(得分:3)

enum NetworkResult<T> {
    case json(T)
    case error(Error)

    var error: Error? {
        if case let .error(error) = self {
            return error
        } else {
            return nil
        }
    }
}

        guard case let .error(error) = self else {
            return nil
        }

        return error

答案 1 :(得分:1)

与Peter Cheng建议的if case构造杂耍,我实际上找到了多种方法来编写它。

let在外:

var error: Error? {
    if case let .error(error) = self {
        return error
    }
    return nil
}

内置let

var error: Error? {
    if case .error(let error) = self {
        return error
    }
    return nil
}

守卫等同物......

let在外:

var error: Error? {
    guard case let .error(error) = self else {
        return nil
    }
    return error
}

内置let

var error: Error? {
    guard case .error(let error) = self else {
        return nil
    }
    return error
}

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