Swift枚举可以有多个原始值吗?

Rob*_*ins 18 enums enumeration swift

我想将两个原始值关联到枚举实例(想象一个表示错误类型的枚举,我想要Error.Teapot一个code值为418 的Int类型属性,并将String属性设置为I'm a teapot.)

请注意原始值关联值之间的差异- 我希望所有Teapot实例都有code418,我不希望每个Teapot实例都有唯一的关联值.

有没有比将计算属性添加到枚举的更好的方法switch,self以便查找适当的值?

jak*_*ken 17

你有几个选择。但它们都不涉及原始值。原始值并不是完成任务的正确工具。

选项 1(一般):相关值

我个人强烈建议不要在每个枚举案例中使用多个关联值。关联的值应该是显而易见的(因为它们没有参数/名称),并且有一个以上的值会严重混淆水。

也就是说,这是语言让你做的事情。如果这是您需要的东西,这也允许您对每个案例进行不同的定义。例子:

enum ErrorType {
    case teapot(String, Int)
    case skillet(UInt, [CGFloat])
}
Run Code Online (Sandbox Code Playgroud)

选项 2(更好):元组!和计算属性!

元组是 Swift 的一个很棒的特性,因为它们赋予你创建临时类型的能力。这意味着您可以在线定义它。甜的!

如果您的每个错误类型都将有一个代码和一个描述,那么您可以拥有一个计算info属性(希望有一个更好的名称?)。见下文:

enum ErrorType {
    case teapot
    case skillet

    var info: (code: Int, description: String) {
        switch self {
        case .teapot:
            return (418, "Hear me shout!")
        case .skillet:
            return (326, "I'm big and heavy.")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

调用它会容易得多,因为您可以使用美味、美味的点语法

let errorCode = myErrorType.info.code


Ant*_*nio 13

不,枚举不能有多个原始值 - 它必须是单个值,实现Equatable协议,并且可以按文档中的描述进行文字转换.

我认为在您的情况下最好的方法是使用错误代码作为原始值,并使用预先填充的静态字典支持的属性,错误代码为键,文本为值.