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

990
Views
Conformidad de enumeración rápida con identificable: el tipo no se ajusta al protocolo identificable

Tengo una enumeración con valores asociados, que quiero usar como elemento en RxDataSources. Intenté ajustarlo a identificable al ajustarlo a Hashable como a continuación

 enum DriverHubWidget: Hashable, Identifiable { static func == (lhs: DriverHubWidget, rhs: DriverHubWidget) -> Bool { return lhs.hashValue == rhs.hashValue } var id: Int { hashValue } case greetings(DriverHubGreetingsViewModel) case scorecard(DriverHubScorecardSummary?, Error?) case optOut func hash(into hasher: inout Hasher) { switch self { case .greetings( _): return hasher.combine(1) case .scorecard( _, _): return hasher.combine(2) case .optOut: return hasher.combine(3) } } }

Implementé la función hasher simplemente asignando a cada caso un valor Int. Luego, para cumplir con identificable, agregué una propiedad de identificación que devuelve el hashValue. Esto compila muy bien.

Ahora, cuando trato de usar esto para declarar un alias de tipo para el modelo de sección, como a continuación

 typealias WidgetSection = AnimatableSectionModel<String, DriverHubWidget>

Compila y arroja el error, Type 'DriverHubWidget' does not conform to protocol 'IdentifiableType'

No puedo entender por qué no funciona, se compila bien cuando las enumeraciones se ajustan a Hashable e identificable, pero cuando se usa, la conformidad de alguna manera no es válida ¿Es porque los valores asociados para las enumeraciones no son Hashable?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

(Esta no es una respuesta completa, pero es demasiado larga para un comentario. Considéralo una adición a lo que ya dijo Sweeper)

Para que los objetos sean Identifiable , deben tener una noción de identidad estable (es decir, que no cambie con el tiempo) que los distinga de otros objetos relacionados. Depende de usted exactamente qué noción de identidad tiene sentido para sus propósitos. Como menciona la documentación :

Identificable deja sin especificar la duración y el alcance de la identidad.

  • Las identidades pueden tener cualquiera de las siguientes características: Garantía siempre única, como UUID.
  • Persistentemente único por entorno, como claves de registro de base de datos.
  • Único para la vida útil de un proceso, como enteros incrementales globales.
  • Único durante la vida útil de un objeto, como los identificadores de objetos.
  • Único dentro de la colección actual, como índices de colección. Depende tanto del conformador como del receptor del protocolo documentar la naturaleza de la identidad.
  1. Probablemente no quiera ignorar los valores asociados a su noción de identidad. De lo contrario, su código podría probar dos objetos como idénticos, incluso si sus valores asociados difieren.

    En la práctica, eso significa que DriverHubGreetingsViewModel , DriverHubScorecardSummary también deberán cumplir con Identifiable . ¿Tu Error? valor asociado, probablemente querrá convertirlo en (Error & Identifiable)? *

  2. No puede delicar su implementación de id a hashValue , porque los valores hash son (por diseño) impredecibles. Es muy posible que los tres casos terminen con la misma identificación (esto sucedería si el hash se sembrara de tal manera que los hash de 1, 2 y 3 colisionen)

Otra nota: tener un modelo opcional, seguido de un error opcional es un olor a código en Swift. Este es un vestigio de Objective C, cuyo sistema de tipos carecía de una forma ligera de expresar un valor de un tipo u otro (un tipo "o" o "suma"). Swift admite enumeraciones con valores asociados (¡ya está utilizando uno!) que incluso pueden ser genéricos. Ya hay uno integrado en la biblioteca estándar para usted: Result<Success, Failure>

Entonces, en lugar de una tarjeta de puntuación de case scorecard(DriverHubScorecardSummary?, Error?) , Yo recomendaría:

 case scorecard(Result<DriverHubScorecardSummary, Error & Identifiable>)
over 4 years ago · Santiago Trujillo Report

0

Ha confundido Identifiable , un protocolo integrado de Swift, con IdentifiableType , un protocolo de la biblioteca RxDataSource.

Simplemente puede ajustarse a IdentifiableType .

 enum DriverHubWidget: Hashable, IdentifiableType { var identity: Int { hashValue } ... }

Sin embargo, la forma en que te ajustas a Hashable me parece extraña. Está considerando dos valores de la enumeración iguales siempre que sean el mismo caso y sin tener en cuenta sus valores asociados. Es decir, .greeting(x) == .greeting(y) sería verdadero. Esto parece bastante contraintuitivo. Si esto es realmente lo que desea para la identity , es posible que desee implementar identity de esta manera:

 var identity: Int { switch self { case .greetings( _): return 1 case .scorecard( _, _): return 2 case .optOut: return 3 } }

y ajustarse a Hashable teniendo en cuenta los valores asociados, o no ajustarse a Hashable en absoluto.

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!