【问题标题】:Compare enums in Swift比较 Swift 中的枚举
【发布时间】:2016-02-05 11:20:35
【问题描述】:

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

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 方法。

【问题讨论】:

    标签: swift generics enums comparable equatable


    【解决方案1】:

    您的enums 的共同点是您想利用它们是RawRepresentable,而它们的RawValue 类型是String

    所以你需要一个类似的函数:

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

    【讨论】:

    • 这行得通,虽然我需要更多的东西来理解实际发生的事情。
    • @schnabler 是的,从一开始就很难理解泛型。我发现有用的事情是认为您在这里声明的不是单个函数,而是真正的整个函数家族,每个实现 RawRepresentable 并具有 String 类型的 RawValue 类型的函数都有一个。
    【解决方案2】:

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

    功能:

    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
            }
        }
    
    

    【讨论】:

    • 那里不需要通用函数。 func alert(t: CustomStringConvertible) -&gt; String { return t.description } 工作正常。
    • @MikePollard 请也看看我的枚举。我的目的是实现面向协议的思想。它可以具有警报功能,可以与任何符合CustomStringConvertible的事物一起使用,无论是枚举,结构还是类
    • 是的,只是说func alert(t: CustomStringConvertible) -&gt; String { return t.description } 就是这样做的。接受任何CustomStringConvertible
    • 虽然我最终使用了@MikePollard 的解决方案,但这个答案在理解协议方面帮助了我很多。
    猜你喜欢
    • 1970-01-01
    • 2014-03-15
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多