• IOS自定义NSDictionary键值类


    使用OC自定义了一个IntPair类作为NSDictionary类的键值,与JAVA中的Pair<int,int>使用方式类似,然而在使用过程中遇到了各种问题,有必要记录一下。

    首先,需要实现NSCoping协议,如果不实现的话,在使用IntPair作为key向dictionary中添加数据时会报警告:Sending 'IntPair *__strong to parameter of incompatible type 'id<NSCopying> _Nonnull'

    一开始没管,结果运行的时候,在setObject forKey函数这里直接崩溃,setObject forKey的声明如下:

    - (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey; 
    

    所以应该实现这个方法。

    然后,实现了NSCopying协议后,发现key值不能比较是否相等,同样的key值被添加了多次,经过搜索知道,还需要重载NSObject的两个方法

    -(BOOL) isEqual:(id) object;
    -(NSUInteger) hash;
    

    isEqual方法比较好理解,用于判断两个对象是否相等,比较好实现,

    hash方法有必要说明一下,这个方法返回一个整数值作为哈稀表的表地址,熟悉哈稀算法的话就应该明白了,同一个键值的hash返回值也应该相同

    下面是IntPair类的完整实现:

    IntPair.h

    #import <Foundation/Foundation.h>
    
    @interface IntPair : NSObject<NSCoding,NSCopying>
    
    @property(nonatomic,assign) int first;
    @property(nonatomic,assign) int second;
    
    -(IntPair *) initWithFirst:(int) first andSecond:(int) second;
    
    @end
    

    IntPair.m

    #import "IntPair.h"
    
    @implementation IntPair
    
    -(IntPair *) initWithFirst:(int)first andSecond:(int)second{
        self.first = first;
        self.second = second;
        return self;
    }
    
    -(BOOL) isEqual:(id)object{
        IntPair *pair = (IntPair *)object;
        if(pair != nil){
            if(self.first == pair.first && self.second == pair.second){
                return YES;
            }
        }
        return NO;
    }
    
    -(NSUInteger) hash{
        return self.first * 1000 + self.second;
    }
    
    -(void) encodeWithCoder:(NSCoder *)aCoder{
        NSNumber *first = [[NSNumber alloc] initWithInt:self.first];
        NSNumber *second = [[NSNumber alloc] initWithInt:self.second];
        [aCoder encodeObject:first forKey:@"first"];
        [aCoder encodeObject:second forKey:@"second"];
    }
    
    -(id) initWithCoder:(NSCoder *)aDecoder{
        NSNumber *first = [aDecoder decodeObjectForKey:@"first"];
        NSNumber *second = [aDecoder decodeObjectForKey:@"second"];
        self.first = [first intValue];
        self.second = [second intValue];
        
        return self;
    }
    
    -(id) copyWithZone:(NSZone *)zone{
        IntPair *pair = [[IntPair allocWithZone:zone] initWithFirst:self.first andSecond:self.second];
        return pair;
    }
    
    @end
    

      

  • 相关阅读:
    【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)
    【Luogu1879】玉米田(状态压缩,动态规划)
    【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)
    蒟蒻关于斜率优化DP简单的总结
    【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)
    【BZOJ4196】【NOI2015】软件包管理器(树链剖分,线段树)
    【BZOJ1483】【HNOI2009】梦幻布丁(启发式合并,平衡树)
    【BZOJ1058】【ZJOI2007】报表统计(链表,堆,Splay)
    【BZOJ1012】【JSOI2008】最大数(线段树)
    【SHOI2012】魔法树(树链剖分,线段树)
  • 原文地址:https://www.cnblogs.com/luleigreat/p/5754194.html
Copyright © 2020-2023  润新知