Ho il seguente oggetto:
#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
Quello che faccio è di base sovrascrittura NSObject metodi di confronto, non c'è bisogno di reinventare la ruota e il codice mantiene più pulito così:
#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
Usage:
Season *season2 = [Season seasonWithYear:2010 season:kFall];
Season *season3 = [Season seasonWithYear:2009 season:kFall];
[season2 isEqual:season3];
fonte
2016-06-11 06:00:36
Ciao Rob. Bella risposta! Dato che sono un "nuovo sviluppatore", farò esattamente come hai suggerito. Questo è quello che avevo in mente in primo luogo. Grazie molto. – TalkingCode
Grazie per aver segnalato questo. Mentre ancora non capisco PERCHÉ isEqual non è abbastanza per determinare l'uguaglianza, stavo ottenendo un comportamento davvero strano di NSCountedSet perché non avevo idea che l'hash entrasse in gioco con i test di uguaglianza generici. – LucasTizma
@LucasTizma È necessario implementare 'hash' perché è utilizzato per le ottimizzazioni. 'isEqual:' potrebbe essere molto costoso. Si consideri un enorme 'NSString'. Devi confrontare ogni personaggio. Invece, per prima cosa controlla "hash". Questo è un numero semplice, quindi il confronto è molto veloce e per le strutture di dati simili a un bucket lo hai già calcolato comunque. Se gli hash sono uguali, solo allora 'isEqual:' chiama. Va bene per due cose ineguali avere lo stesso hash, e il metodo di hash più semplice è 'return 1;'. Ma questo può danneggiare le prestazioni se ci sono molti controlli di uguaglianza e 'isEqual:' è costoso. –