Tengo la siguiente enumeración.
enum EstimateItemStatus: Printable {
case Pending
case OnHold
case Done
var description: String {
switch self {
case .Pending: return "Pending"
case .OnHold: return "On Hold"
case .Done: return "Done"
}
}
init?(id : Int) {
switch id {
case 1:
self = .Pending
case 2:
self = .OnHold
case 3:
self = .Done
default:
return nil
}
}
}
Necesito obtener todos los valores sin procesar como una matriz de cadenas (así ["Pending", "On Hold", "Done"]
).
Agregué este método a la enumeración.
func toArray() -> [String] {
var n = 1
return Array(
GeneratorOf<EstimateItemStatus> {
return EstimateItemStatus(id: n++)!.description
}
)
}
Pero recibo el siguiente error.
No se puede encontrar un inicializador para el tipo 'GeneratorOf' que acepte una lista de argumentos del tipo '(() -> _)'
¿Existe una forma más fácil, mejor o más elegante de hacer esto?
Respuestas:
Para Swift 4.2 (Xcode 10) y posterior
Hay un
CaseIterable
protocolo:Para Swift <4.2
No, no puede consultar los
enum
valores que contiene. Vea este artículo . Tienes que definir una matriz que enumere todos los valores que tienes. Consulte también la solución de Frank Valbuena en " Cómo obtener todos los valores de enumeración como una matriz ".fuente
Swift 4.2 presenta un nuevo protocolo llamado
CaseIterable
que cuando cumpla con, puede obtener una matriz de los
enum
casos como estefuente
Agregue el protocolo CaseIterable a la enumeración:
Uso:
fuente
Hay otra forma en que al menos es segura en tiempo de compilación:
Tenga en cuenta que esto funciona para cualquier tipo de enumeración (RawRepresentable o no) y también si agrega un nuevo caso, obtendrá un error del compilador que es bueno ya que lo obligará a tenerlo actualizado.
fuente
Encontré en alguna parte este código:
Utilizar:
devolver lista de casos de YourEnum
fuente
Para obtener una lista con fines funcionales, use la expresión
EnumName.allCases
que devuelve una matriz, por ejemplole dará una lista de cadenas dado que
EnumName: String, CaseIterable
Nota: use en
allCases
lugar deAllCases()
.fuente
["Pendiente", "En espera", "Listo"]
fuente
Actualización para Swift 5
La solución más fácil que he encontrado es usar
.allCases
una enumeración que se extiendeCaseIterable
.allCases
en cualquierCaseIterable
enumeración devolverá unCollection
de ese elemento.más información sobre CaseIterable
fuente
case OnHold = "On Hold"
y ese se convierte en el valor bruto de cada uno.Para Swift 2
Para usarlo:
fuente
hashValue
ser0..n
?Después de la inspiración de Sequence y horas de probar n errores. Finalmente obtuve este cómodo y hermoso Swift 4 way en Xcode 9.1:
Uso:
Salida:
fuente
Puedes usar
fuente
Si su enumeración es incremental y está asociada con números, puede usar el rango de números que asigna a los valores de enumeración, así:
Esto no funciona con enumeraciones asociadas con cadenas o cualquier otra cosa que no sean números, ¡pero funciona muy bien si ese es el caso!
fuente
Extensión en una enumeración para crear allValues.
fuente