Подтвердить что ты не робот

Перечисление кортежей в Swift

Можно ли создать перечисление Tuples в Swift?

Я хотел бы построить что-то вроде:

enum ErrorCode: (Int, String) {
    case Generic_Error = (0, "Unknown")
    case DB_Error = (909, "Database")
}

Но он не компилируется... Есть ли способ получить аналогичный результат?

4b9b3361

Ответ 1

Это зависит от того, что вы подразумеваете под "похожим". Я использую Struct со статическими константными свойствами:

struct Trouble {
    static let Generic_Error = (0, "Unknown")
    static let DB_Error = (909, "Database")
}

Теперь такие вещи, как Trouble.Generic_Error, можно использовать во всем коде.

Ответ 2

Перечисления Swift не могут иметь Tuples как тип необработанного значения.

Альтернативные подходы включают в себя сохранение кода и получение от него описания:

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

    var description: String {
        switch self {
        case .Generic:
            return "Unknown"
        case .DB:
            return "Database"
        }
    }
}

... или сохранение связанных значений для кода и описания в самих случаях перечисления:

enum Error {
    case Generic(Int, String)
    case DB(Int, String)
}

Если вы просто ищете постоянные значения, также будет предложено предложение @matt об их организации в рамках struct.

Ответ 3

вы можете сделать такую ​​вещь, может быть:

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

и вы можете сделать следующее:

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

Ответ 4

Решение похоже на @holex, но вместо функции вы можете использовать var.

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

и позже:

let myType = SomeType.type1
let typeName = myType.typeNameAndDescription.name
let typeDescription = myType.typeNameAndDescription.description

Ответ 5

Вы можете соответствовать 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
        }
    }
}