Mac NSDictionary 和Java HashMap比较

这两个在实际开发中,都是用于存放key-value值的,所以放一块记录一下。

NSDictionay是不可变的,具体用法看参考,在java中好像没有这种数据结构,至少我在开发中没用过。NSDictionay也是可以用泛型的,可是好像很少有人这样用,导致NSDictionary中存了的数据类型都不确定,这个给后续取数据的时候,带来了类型出错的风险。可以理解为NSDictionary中key和value都是id类型的,id类型可以理解成是NSObject,和java中的Object类是一个意思。所以,从NSDictionary取数据的时候要类型判断和类型转换,保证执行的时候类型转换报错,不过在OC中有一种取巧的办法,id类型的指针可以调用任何类型中的方法,这个在java中绝对是做不到,Object类型的引用只能调用Object中的方法,要不然编译都报错,如果我们知道dic中的value,可能是NSNumber也可能是NSString类型,但是,都可以转成数字,我们找一个NSNumber和NSString中都有的方法就可以了,看下面的代码:

    [self.webview.jsBridge registerMethod:@"history_HN_add" handler:^(id ps, SHJSBridgeSendResponse callback) {
        if ([ps isKindOfClass:[NSDictionary class]]) {
            //vid cid site title playTime duration aid type
            SHLocalPlayHistory *record = [[SHLocalPlayHistory alloc] init];
            record.vid = [ps[@"vid"] longLongValue];
            record.cid = [ps[@"cid"] intValue];
            record.site = [ps[@"site"] intValue];
            record.t = [ps[@"playTime"] longLongValue];
            record.tvLength = [ps[@"duration"] longLongValue];
            record.aid = [ps[@"aid"] longLongValue];
            record.title = (NSString *)ps[@"title"];
            record.viewTime = [[SHUtil currentDateStr] longValue];
            NSString *type = (NSString *)ps[@"type"];
            if (type.length == 0) {
                type = @"my";
            }
            record.type = type;
            [[SHPlayHistoryManager sharePlayHistoryMgr] addH5CloudHistoryRecord:record];
        }
    }];

在java中,使用HashMap肯定是要使用泛型的,不是使用泛型,被认为的新手,而且会有很大风险。

 

 

 

 

 

参考:

NSDictionary的基本使用 - OC

你可能感兴趣的:(Mac开发)