Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

658
Vistas
Swift: Índice de un elemento en enumeración (CaseIterable)

El siguiente código (compila sin errores) recupera el índice de un elemento en un tipo de enumeración CaseIterable particular

 public enum MyEnum : CaseIterable { case ONE, TWO, THREE public func ordinal() -> Int? { return MyEnum.allCases.firstIndex(of: self) } }

Quiero hacer una función genérica para trabajar con todas las enumeraciones CaseIterable.

Si intento:

 public extension CaseIterable { public func ordinal() -> Int? { return CaseIterable.allCases.firstIndex(of: self) } }

Recibo un error del compilador " Member 'allCases' cannot be used on value of protocol type 'CaseIterable'; use a generic constraint instead " que es bastante lógico, ya que se desconoce el tipo de enumeración real.

Cuando intento CaseIterable<T> , aparece otro error, ya que CaseIterable no se declara como tipo genérico.

¿Hay alguna manera?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Un par de cambios son necesarios:

  1. El tipo de devolución debe ser Self.AllCases.Index? en lugar de Int? . En la práctica, estos tipos serán equivalentes, como se verá a continuación.
  2. También debe restringir cualquier tipo a Equatable , porque debe ser equatable para usar firstIndex(of:) . Nuevamente, en la práctica, cualquier CaseIterable generalmente será una enumeración sin valores asociados, lo que significa que será equiparable automáticamente.
  3. (Cambio opcional) Esta función nunca devolverá nil , porque está encontrando un caso en un CaseIterable . Por lo tanto, puede eliminar la opcionalidad en el tipo de retorno ( Self.AllCases.Index ) y forzar el desenvolvimiento.

Ejemplo:

 public extension CaseIterable where Self: Equatable { public func ordinal() -> Self.AllCases.Index { return Self.allCases.firstIndex(of: self)! } } enum Example: CaseIterable { case x case y } Example.y.ordinal() // 1 type(of: Example.y.ordinal()) // Int

Personalmente, agregaría que "Ordinal" generalmente significa algo diferente de lo que está haciendo, y recomendaría cambiar el nombre de la función a elementIndex() o algo así. Pero eso es un aparte.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda