Перечисление кортежей в Swift
Можно ли создать перечисление Tuples в Swift?
Я хотел бы построить что-то вроде:
enum ErrorCode: (Int, String) {
case Generic_Error = (0, "Unknown")
case DB_Error = (909, "Database")
}
Но он не компилируется... Есть ли способ получить аналогичный результат?
Ответы
Ответ 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
}
}
}
Ответ 6
Создать перечисление как Int.
Например:
https://github.com/rhodgkins/SwiftHTTPStatusCodes/blob/master/Sources/HTTPStatusCodes.swift