斯威夫特的元组枚举

Mat*_*oal 58 swift

这可以在Swift中创建一个元组枚举吗?

我想构建类似的东西:

enum ErrorCode: (Int, String) {
    case Generic_Error = (0, "Unknown")
    case DB_Error = (909, "Database")
}
Run Code Online (Sandbox Code Playgroud)

但它没有编译......有没有办法获得类似的结果?

mat*_*ttt 55

Swift枚举不能将元组作为原始值类型.

替代方法包括存储代码并从中导出描述:

enum ErrorCode: Int, CustomStringConvertible {
    case Generic = 0
    case DB = 909

    var description: String {
        switch self {
        case .Generic:
            return "Unknown"
        case .DB:
            return "Database"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...或者在枚举案例中存储代码和描述的关联值:

enum Error {
    case Generic(Int, String)
    case DB(Int, String)
}
Run Code Online (Sandbox Code Playgroud)

如果你只是在寻找不变的价值观,那么@ matt的建议也可以在其中进行组织struct.


mat*_*att 42

这取决于你所说的"相似".我所做的是使用具有静态常量属性的Struct:

struct Trouble {
    static let Generic_Error = (0, "Unknown")
    static let DB_Error = (909, "Database")
}
Run Code Online (Sandbox Code Playgroud)

现在Trouble.Generic_Error可以在整个代码中使用.

  • 我认为这是最好的答案,但 Swift 实际上比 Kotlin 更不兼容 (2认同)

小智 30

您可以符合RawRepresentable并(Int, String)用作Self.RawValue关联类型.

enum ErrorCode: RawRepresentable {
    case Generic_Error
    case DB_Error

    var rawValue: (Int, String) {
        switch self {
        case .Generic_Error: return (0, "Unknown")
        case .DB_Error: return (909, "Database")
        }
    }

    init?(rawValue: (Int, String)) {
        switch rawValue {
        case (0, "Unknown"): self = .Generic_Error
        case (909, "Database"): self = .DB_Error
        default: return nil
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确的答案,它允许使用元组,就像所问的问题而不是结构(例如当前的正确答案)一样 (3认同)

hol*_*lex 17

你可以做这样的事情,也许:

enum ErrorCode {
    case Generic_Error
    case DB_Error

    func values() -> (code: Int!, description: String?)! {
        switch self {
        case .Generic_Error:
            return (0, "Unknown")
        case .DB_Error:
            return (909, "Database")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你以后可以做这件事:

let errorCode: ErrorCode = ErrorCode.Generic_Error;
if (errorCode.values().code == 0) {
    // do the business here...
}
Run Code Online (Sandbox Code Playgroud)


Au *_*Ris 13

创建enum并添加var元组类型(String, String).

enum SomeType {
    case type1
    case type2
    case type3

    var typeNameAndDescription: (name: String, description: String) {
       switch self {
       case .type1:
            return ("type1 name", "type1 description")
        case .type2:
            return ("type2 name", "type2 description")
        case .type3:
            return ("type3 name", "type3 description")
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

let myType = SomeType.type1
let typeName = myType.typeNameAndDescription.name
let typeDescription = myType.typeNameAndDescription.description
Run Code Online (Sandbox Code Playgroud)