varias superponer studio lineas histogramas graficos graficas objective-c

objective-c - studio - superponer graficas en r



¿Cómo comparo objetos en Objective-C? (4)

¿Cómo comparo dos objetos de una clase personalizada? Mi idea fue agregar un método adicional a la clase en la que puedo comparar el objeto actual con otro objeto del mismo tipo.

Entonces puedo escribir mi propio código de cómo se compara cada campo de la clase.

Así es como lo haría. ¿O hay algunos métodos predefinidos para hacer eso? Como "isEqualTo" de la clase NSString?


La forma estándar es anular - (BOOL)isEqual:(id)anObject y - (NSUInteger)hash .

Debe leer la documentación del protocolo NSObject y this pregunta SO tiene algunas respuestas interesantes sobre cómo escribir su método hash.


Mira el isEqual: y compare:


Tengo el siguiente objeto:

#import <Foundation/Foundation.h> typedef NS_ENUM(NSUInteger, SeasonType) { kWinter, kSpring, kSummer, kFall }; @interface Season : NSObject @property (nonatomic) SeasonType season; @property (nonatomic) NSUInteger year; +(id) seasonWithYear:(NSInteger)year season:(SeasonType)season; -(id) initWithYear:(NSInteger)year season:(SeasonType)season; @end

Lo que hago es sobrescribir los métodos de comparación de NSObject base, no hay necesidad de reinventar la rueda y el código se mantiene más limpio también:

#import "Season.h" @interface Season() @end @implementation Season +(id) seasonWithYear:(NSInteger)year season:(SeasonType)season{ return [[self alloc] initWithYear:year season:season]; } -(id) initWithYear:(NSInteger)year season:(SeasonType)season{ self = [super init]; if (self) { _year = year; _season=season; _baseDate=nil; } return self; } #pragma mark - NSObject - (BOOL)isEqual:(id)object { if (self == object) { return YES; } if (![object isKindOfClass:[Season class]]) { return NO; } return [self _isEqualToSeason:(Season *)object]; } - (NSUInteger)hash { return self.season ^ self.year; } #pragma mark - Private/Internal - (BOOL)_isEqualToSeason:(Season *)season { if (!season) { return NO; } return ((!self.season && !season.season) || self.season == season.season) && ((!self.year && !season.year) || self.year == season.year) ; } @end

Uso:

Season *season2 = [Season seasonWithYear:2010 season:kFall]; Season *season3 = [Season seasonWithYear:2009 season:kFall]; [season2 isEqual:season3];


Los punteros a -isEqual: son buenos, pero si implementa -isEqual: también debe implementar -hash de tal manera que si dos objetos devuelven YES a -isEqual: también devolverán el mismo valor para -hash . La implementación de isEqual: sin implementar también -hash conduce a algunos errores muy sorprendentes cuando se usan colecciones como NSArray.

Para los nuevos desarrolladores, tiendo a recomendar la sobrecarga -isEqual: En su lugar, recomiendo usar la misma técnica que NSString y crear un -isEqualToFoo: personalizado (donde Foo es su clase) hasta que comprenda el impacto de -isEqual: en las colecciones y, específicamente, desea este comportamiento. Sobrecarga -isEqual: potente, pero los errores que puede crear son sutiles. Crear su propio comparador personalizado es más seguro y claro en muchos casos.