如何在nsdictionary/nsmutabledictionary中使用自定义类型的键

如何在NSDictionary/NSMutableDictionary中使用自定义类型的键

背景

写了个记账APP,记录一下平时和她在一起时的花销,想要实现的一个功能是根据新建记录项的时刻从历史记录中自动推荐一个合适的花销项。这样在记录一些平时比较规律的花销时可以很方便。

那么问题来了

由于没找到小顶堆相关的类,所以就拿NSMutableDictionary来实现。花销项作为key,value则用来记录同一花销出现的次数。由于我的每一项花销是一个自定义类型,导致NSMutableDictionary认为所有的key都不相同,无法实现功能。

解决

首先想到需要自定义判断是否相等的方法,查看NSObject可以发现,该方法确实存在,在我的自定义花销项类型中重写该方法:

-(BOOL)isEqual:(id)object;
然而并没有解决…于是

赶快百度,有幸找到了这篇博文。**原来**NSDictionary判断两个键是否相等一共有两步:
- 首先对比二者的hash,如果不相同则直接返回NO
- 然后才调用isEqual方法进行判断
也就是说,还需要重写

-(NSUInteger)hash

至于如何计算hash值依然是参考了上面博文

-(NSUInteger)hash
{
    return 0;
}

对,直接返回了0。这样就直接通过isEqual来比较啦,毕竟isEqual函数也并不复杂。

另外

注意字典的KeyType是id类型,这意味着自定义类型需要遵循NSCopying协议,并实现

- (id)copyWithZone:(NSZone *)zone

也行正如上述博文所说,字典大概总是会拷贝一份新的对象作为键吧。就像C++那样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NSDictionary是Objective-C语言的一个字典类,用于存储值对。它可以存储任意类型的值,但在获取值时需要根据实际情况进行类型判断。可以使用以下方法来判断NSDictionary某个对应的值的类型: 1. isKindOfClass:方法:用于判断某个对象是否属于某个类或其子类。可以使用该方法判断NSDictionary某个对应的值是否属于某个类或其子类。 2. isKindOfClass:方法的使用示例: ``` id value = [dictionary objectForKey:@"key"]; if ([value isKindOfClass:[NSString class]]) { // value是NSString类型 } else if ([value isKindOfClass:[NSNumber class]]) { // value是NSNumber类型 } else { // 其他类型 } ``` 3. isMemberOfClass:方法:用于判断某个对象是否为某个类的实例。可以使用该方法判断NSDictionary某个对应的值是否为某个类的实例。 4. isMemberOfClass:方法的使用示例: ``` id value = [dictionary objectForKey:@"key"]; if ([value isMemberOfClass:[NSString class]]) { // value是NSString类型 } else if ([value isMemberOfClass:[NSNumber class]]) { // value是NSNumber类型 } else { // 其他类型 } ``` 5. respondsToSelector:方法:用于判断某个对象是否实现了某个方法。可以使用该方法判断NSDictionary某个对应的值是否实现了某个方法。 6. respondsToSelector:方法的使用示例: ``` id value = [dictionary objectForKey:@"key"]; if ([value respondsToSelector:@selector(length)]) { // value实现了length方法,可能是NSString类型 } else if ([value respondsToSelector:@selector(intValue)]) { // value实现了intValue方法,可能是NSNumber类型 } else { // 其他类型 } ``` 需要注意的是,在判断NSDictionary某个对应的值的类型时,要先判断该值是否为nil,否则会导致程序崩溃。可以使用以下方法来判断某个值是否为nil: ``` id value = [dictionary objectForKey:@"key"]; if (value == nil) { // 值为nil } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值