swift - 在 Swift 中比较枚举

标签 swift generics enums comparable equatable

我有一个包含两个枚举的类(很简单):

class Errors {
    enum UserError: String {
        case NoToken = "No token!"
        case NoPassword = "No password!"
    }

    enum BackendError: String {
        case NoConnection = "No connection!"
        case ServerBusy = "Server is busy!"
    }
}

现在我想编写一个通用函数,它接受 UserError 或 BackendError 并根据输入返回一个字符串。像这样:

func alert(type: /* Accepts Error.UserError or BackendError*/) -> String {
    // checks if UserError or BackendError and returns .rawValue
}

我的第一个方法是使用泛型——但坦率地说,我在理解这个概念时遇到了困难,而且我倾向于认为我在这里从根本上是错误的。我所做的是:

func alert<T>(type: T) {
    if type == Errors.UserError {
        return Errors.UserError.NoPassword.rawValue
    } else {
        return Errors.BackendError.NoConnection.rawValue
    }
 }

显然,这是行不通的。

binary operator cannot be applied to operands of type 'T' and 'Errors.UserError.Type'

我知道这与缺少实现 Equatable/Comparable 协议(protocol)以及我对使用泛型普遍缺乏理解有关。我的问题是:

  1. 如何将我的通用“类型”参数与我的枚举进行比较?

  2. 我对泛型的理解完全错误吗?

此外:我想避免使用 AnyObject 方法。

最佳答案

enums 的共同点和您想利用的是它们是 RawRepresentable,其中它们的 RawValue 类型是 字符串

所以你需要一个像这样的函数:

func alert<T: RawRepresentable where T.RawValue == String>(t: T) -> String {
    return t.rawValue
}

关于swift - 在 Swift 中比较枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222866/

相关文章:

iOS xib文件差异对比

java - 我可以在不使用泛型的情况下在 Java 中获取 entrySet 中的键列表吗?

c# - 遍历枚举?

c++ - C 和 C++ 中的 ENUM 类型和用法

java - 将枚举实例引用为该类型的另一个实例的字段是否合法?

ios - 当应用程序将终止时如何运行异步/等待任务?

swift - AVAudioPlayer 对象在 swift 中不稳定

ios - 在 UILongPressGestureRecognizer 之后在 UICollectionViewCell 上显示按钮

javascript - 是否可以仅针对 typescript 上的特定类型扩展 Array.prototype ?

java - 静态泛型方法的返回类型可以取决于其参数吗?