阅读 531

自定义类型的比较方法

先说一下需求,客户端需要统计一个事件的点击次数,有这样的一个数据类型

 [{"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: 方法也是通过遍历来实现的话,其实复杂度应该差不不多。以上

文章分类
iOS
文章标签