1

我有一个包含两个这样的枚举的类(变得简单):

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 协议以及我对使用泛型的普遍缺乏了解有关。我的问题是:

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

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

另外:我想避免这种AnyObject方法。

4

2 回答 2

1

我希望我没有误解你的目的。我假设您想要一个通用函数可以接受任一枚举也打印出每个自己的字符串。也许你可以把我的回答作为参考。

功能:

func alert<T: CustomStringConvertible>(t: T) -> String {
    return t.description
}

枚举:



    enum UserError: String, CustomStringConvertible {
        case NoToken = "No token!"
        case NoPassword = "No password!"

        var description: String {
            return self.rawValue
        }
    }

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

        var description: String {
            return self.rawValue
        }
    }

于 2016-02-05T11:39:53.377 回答
1

enums的共同点和您想要利用的是,它们是RawRepresentable他们的RawValue类型所在String

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

func alert<T: RawRepresentable where T.RawValue == String>(t: T) -> String {
    return t.rawValue
}
于 2016-02-05T11:29:03.357 回答