变更记录

序号 录入时间 录入人 备注
1 2015-06-09 Alfred Jiang -
2 2015-12-23 Alfred Jiang -

方案名称

NSMutableSet - 在 NSMutableSet 中添加自定义对象时怎么保证不重复

关键字

NSMutableSet \ hash \ isEqual \ 重复

需求场景

  1. 需要将自定义对象添加入 NSMutableSet,需要保证不重复
  2. 避免存储自定义重复对象

参考链接

  1. NSHipster - Equality

详细内容

通过自定义 hasnisEqual 方法定义相等条件

示例代码如下:

ALFImport.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//
// ALFImport.h
// ALFUMLTool
//
// Created by Alfred Jiang on 6/8/15.
// Copyright (c) 2015 Alfred Jiang. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ImportType) {
IMPORT_TYPE_SYSTEM = 0,
IMPORT_TYPE_USER,
IMPORT_TYPE_WEAK
};

@interface ALFImport : NSObject
{
ImportType type;
NSString *name;
// NSArray *classes;
}

@property(nonatomic,assign) ImportType type;
@property(nonatomic,strong) NSString *name;
//@property(nonatomic,strong) NSArray *classes;

- (NSUInteger)hash;
- (BOOL)isEqual:(id)object;
- (NSString *)description;

@end

ALFImport.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//
// ALFImport.m
// ALFUMLTool
//
// Created by Alfred Jiang on 6/8/15.
// Copyright (c) 2015 Alfred Jiang. All rights reserved.
//

#import "ALFImport.h"

@implementation ALFImport
@synthesize type;
@synthesize name;
//@synthesize classes;

- (BOOL)isEqualToImport:(ALFImport *)import {
if (!import) {
return NO;
}

BOOL haveEqualType = (!self.type && !import.type) || (type == import.type);
BOOL haveEqualName = (!self.name && !import.name) || [self.name isEqualToString:import.name];

return haveEqualType && haveEqualName;
}

- (NSUInteger)hash
{
return self.type ^ [self.name hash];
}

- (BOOL)isEqual:(id)object
{
if (self == object) {
return YES;
}

if (![object isKindOfClass:[ALFImport class]]) {
return NO;
}

return [self isEqualToImport:(ALFImport *)object];
}

- (NSString *)description
{
return [NSString stringWithFormat:@"Import Name : %@",name];
}

@end

效果图

(无)

备注

(无)