es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Objeto Hashable de Objective-C para la fuente de datos Difusa

Estoy intentando implementar una vista de colección con una fuente de datos difusa en Objective-C. Sé que para Swift, los tipos genéricos para UICollectionViewDiffableDataSource son tipos que se conforman tanto con los protocolos Hashable como Identifiable. Pero no sé a qué corresponden estos para Objective-C.

Mi pregunta es si tengo una propiedad de origen de datos como esta:

@property (strong, nonatomic) UICollectionViewDiffableDataSource *dataSource;

¿Qué necesito implementar en MyItemType para que funcione correctamente? ¿Es suficiente con implementar los siguientes métodos o no son correctos y necesito implementar algo más en Objective-C?

  • (BOOL)isEqual:(id)object
  • (NSUInteger)hash
  • (NSComparisonResult)compare:(MyItemType *)other

¿Y qué protocolo(s) debo adoptar para mi objeto de modelo?

MyItemType.h

Aquí está la definición del elemento de modelo. Estos se muestran en una disposición de lista de vista de colección.

“`objc
@interface MyItemType : NSObject

@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic, nullable) NSString *subtitle;
@property (strong, nonatomic, nullable) NSArray<myitemtype *=""> *children;
@property (strong, nonatomic, nullable) UIImage *image;

@end
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que esto funcione con un UICollectionViewDiffableDataSource, necesitas implementar los protocolos Hashable eIdentifiable.

    MyItemType.m

    @implementation MyItemType
    
    - (BOOL) isEqual: (id) objeto {
        si (self == object) {
            return YES;
        }
    
        si (![object isKindOfClass:[MyItemType class]]) {
            volver NO;
        }
    
        return [self.title isEqualToString:[object title]];
    }
    
    - (NSUInteger) hash {
        return [self.title hash];
    }
    
    - (NSComparisonResult) compare: (MyItemType *) otro {
        return [self.title compare:otro.title];
    }
    
    @end
    

    Necesitas implementar los métodos isEqual:, hash y compare: para que MyItemType siga los protocolos Hashable eIdentifiable.

Comments are closed.