簡體   English   中英

如何比較Objective-C中的對象?

[英]How do I compare objects in Objective-C?

如何比較自定義類的兩個對象? 我的想法是在類中添加一個額外的方法,我可以在其中將當前對象與同類的另一個對象進行比較。

所以我可以編寫自己的代碼,比較每個類的字段。

我就是這樣做的。 或者有一些預定義的方法來做到這一點? 像NSString類的“isEqualTo”?

指向-isEqual:的指針是好的,但如果你實現-isEqual: ,你絕對必須實現-hash ,如果兩個對象為-isEqual:返回YES -isEqual:它們也將為-hash返回相同的值。 實現isEqual:當你使用像NSArray這樣的集合時,如果沒有實現-hash會導致一些非常令人驚訝的錯誤。

對於新開發人員,我傾向於建議不要重載-isEqual: . 我建議使用與NSString相同的技術,並創建一個自定義-isEqualToFoo:其中Foo是您的類),直到您了解-isEqual:對集合的影響,並特別想要這種行為。 重載-isEqual:功能強大,但你可以創建的bug很微妙。 在許多情況下,創建自己的自定義比較器更安全,更清晰。

標准方法是覆蓋- (BOOL)isEqual:(id)anObject- (NSUInteger)hash

您應該閱讀NSObject協議的文檔, 這個 SO問題有一些關於如何編寫哈希方法的有趣答案。

查看isEqual:compare:方法。

我有以下對象:

#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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM