如何检查NSDictionary中一级和二级是否存在emp_id键
解决方案
要安全检查一级或二级字典中的emp_id键,核心是先判断对象类型,再执行后续操作,避免直接向非字典对象发送containsObjectForKey:消息导致崩溃。
实现思路
- 先检查当前字典是否包含一级
emp_id键; - 如果存在,取出该键对应的值,判断其是否为
NSDictionary类型; - 若是子字典,再检查子字典中是否包含
emp_id; - 最终综合两种情况的结果,判断是否存在有效
emp_id。
代码示例
// 封装成工具方法,传入待检查的字典 - (BOOL)hasValidEmpIDInDictionary:(NSDictionary *)data { if (!data) { return NO; } // 检查一级emp_id id empValue = data[@"emp_id"]; if (!empValue) { return NO; } // 如果是字符串类型,说明一级emp_id有效 if ([empValue isKindOfClass:[NSString class]]) { return YES; } // 如果是子字典,检查二级emp_id if ([empValue isKindOfClass:[NSDictionary class]]) { return [empValue containsObjectForKey:@"emp_id"]; } // 其他类型(比如数字、数组等),视为无效 return NO; }
调用示例
// 一级字典情况 NSDictionary *data1 = @{@"emp_id" : @"123456"}; BOOL hasEmp1 = [self hasValidEmpIDInDictionary:data1]; // 返回YES // 二级字典情况 NSDictionary *data2 = @{@"emp_id" : @{@"emp_id" : @"123456"}}; BOOL hasEmp2 = [self hasValidEmpIDInDictionary:data2]; // 返回YES // 无emp_id的情况 NSDictionary *data3 = @{@"name" : @"张三"}; BOOL hasEmp3 = [self hasValidEmpIDInDictionary:data3]; // 返回NO // emp_id对应非字符串/字典的情况 NSDictionary *data4 = @{@"emp_id" : @123456}; BOOL hasEmp4 = [self hasValidEmpIDInDictionary:data4]; // 返回NO
关键说明
- 使用
isKindOfClass:判断对象类型,是Objective-C中避免消息发送崩溃的标准做法; - 优先检查一级键,再根据值的类型决定是否进入二级检查,覆盖了两种数据集的场景;
- 方法中加入了对
data为nil的判断,避免空指针异常。
内容的提问来源于stack exchange,提问作者casillas
相关产品推荐
相关产品推荐

