先说一下需求,客户端需要统计一个事件的点击次数,有这样的一个数据类型
[{"id":"1","readings":"2"},{"id":"2","readings":"1"}]
如果点击了某个按钮,比如某个按钮的 id == 1, 就需要将
{"id":"1","readings":"2"}
这个数据中的 readings 的值加 1,最后结果是
[{"id":"1","readings":"3"},{"id":"2","readings":"1"}]
将这个数据上传给服务器就OK 了,
思考🤔
我看到我前同事的实现是经过一系列的遍历,去判断 id 是否相等,考虑到数组有
- (BOOL)containsObject:(ObjectType)anObject;
这个方法,能否直接用这个方法去实现呢。我们知道 containsObject 这个方法 是比较的的指针地址,所以直接用肯定是不好用的
实现 😉
自定义一个类,来重写
- (BOOL)isEqual:(id)other
- (NSUInteger)hash
interface
@interface Zhai : NSObject
@property (nonatomic, strong) NSString *id;
@property(nonatomic, assign) NSInteger readings;
@end
implementation
@implementation Zhai
- (BOOL)isEqual:(id)other
{
if (other == self) {
return YES;
} else {
return [self isEqualZhai:other];
}
}
-(BOOL)isEqualZhai:(Zhai *)objc{
if (!objc) {
return false;
}
BOOL isEqual = (self.id && objc.id) && [self.id isEqualToString:objc.id];
return isEqual;
}
// 如果只是数组的话,可以不用实现这个方法,如果是 NSSet 和 字典的话 需要实现这个方法
- (NSUInteger)hash
{
NSUInteger hashValue = [super hash];
return hashValue;
}
@end
验证 😺
我们先创建三个变量
Zhai *zhai = [Zhai new];
zhai.id = @"1";
zhai.readings = 1;
Zhai *zhai2 = [Zhai new];
zhai2.id = @"2";
zhai2.readings = 3;
Zhai *zhai3 = [Zhai new];
zhai3.id = @"2";
zhai3.readings = 1;
BOOL isEqual = [zhai2 isEqual:zhai3];
这里 isEqual 打印为 YES, 成功
再声明一个变量
NSMutableArray *arr = @[zhai,zhai2].mutableCopy;
// 打印为YES
NSLog(@"%d",isEqual);
Zhai *zhai4 = [Zhai new];
zhai4.id = @"2";
zhai4.readings = 1;
BOOL contain = [arr containsObject:zhai4];
// 这里 contain 为YES
NSLog(@"contain %d",contain);
if (contain) {
// 这里可以看到 indexOfObject 的实现 也和 isEqual 的方法有关
NSInteger index = [arr indexOfObject:zhai4];
Zhai * zhai5 = arr[index];
// 将点击次数 + 1
zhai5.readings += 1;
}
总结 📓
以上就实现了自定义类的 比较和 数组的包含方法。
代码相对清晰一点,减少了遍历的罗列,但是如果 系统的 containsObject: 方法也是通过遍历来实现的话,其实复杂度应该差不不多。以上