Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

662
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!