Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

998
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda