मैं निम्नलिखित वस्तु है:
#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
मुझे क्या अधिलेखित आधार NSObject तुलना तरीकों है, वहाँ पहिया पुनर्रचना की कोई आवश्यकता नहीं है और कोड क्लीनर के रूप में अच्छी तरह से रखता है:
#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
उपयोग:
Season *season2 = [Season seasonWithYear:2010 season:kFall];
Season *season3 = [Season seasonWithYear:2009 season:kFall];
[season2 isEqual:season3];
स्रोत
2016-06-11 06:00:36
हाय रॉब। बहुत बढ़िया जवाब! चूंकि मैं एक "नया डेवलपर" हूं, जैसा कि आपने सुझाव दिया है वैसा ही करूँगा। यह वही है जो मैंने पहली बार दिमाग में किया था। बहुत धन्यवाद। – TalkingCode
इसे इंगित करने के लिए धन्यवाद। जबकि मुझे अभी भी समझ में नहीं आता है कि समानता निर्धारित करने के लिए पर्याप्त नहीं है, मुझे कुछ वास्तविक अजीब एनएससीएन्टेड एसईटी व्यवहार मिल रहा था क्योंकि मुझे नहीं पता था कि हैश सामान्य समानता परीक्षण के साथ खेल में आया था। – LucasTizma
@ लुकास टिज्मा आपको 'हैश' को लागू करने की आवश्यकता है क्योंकि इसका अनुकूलन के लिए उपयोग किया जाता है। 'isEqual:' बहुत महंगा हो सकता है। बड़े पैमाने पर 'एनएसएसटींग' पर विचार करें। आपको हर चरित्र की तुलना करना है। इसके बजाए, आप पहले 'हैश' की जांच करें। यह एक साधारण संख्या है, इसलिए तुलना बहुत तेज है, और बाल्टी जैसी डेटा संरचनाओं के लिए आप इसे पहले से ही गणना कर चुके हैं। यदि हैश बराबर हैं, तो केवल 'isEqual:' कहा जाता है। दो असमान चीजों के लिए एक ही हैश होना ठीक है, और सबसे सरल कानूनी हैश विधि 'वापसी 1' है। लेकिन अगर कई समानता जांच और 'isEqual:' महंगा है तो यह प्रदर्शन को नुकसान पहुंचा सकता है। –