这几天写一段数据迁移脚本,各种bug和闪退,定位以后发现大部分都是NSDictionary取key引发的错误
判断key存在
第一个场景是判断key是否存在,NSDictionary并没有类似containsKey之类的API,网上找到的判断方法,大部分是
if([dict objectForKey:@"xxx"]){
// key存在
}
如果一个@{}不包含某个key,那么调用objectForKey会返回nil,就走不进if的分支
判断key对应的value非空
但是这里的NSDictionary是用FMDB返回的结果,可能key是存在的,但是对应的value是null。那么下面的代码:
[[dict objectForKey:@"money"] intValue];
就会闪退,因为虽然money这个KEY存在,但是对应的value是NSNull。恶心的是,用简单的if方法判断不出value是否是NSNull
if([dict objectForKey:@"money"]){
// logic
}
因为此时objectForKey方法返回的不是nil,而是NSNull,而NSNull是可以走进if分支的。所以正确的判断应该是:
if(![[dict objectForKey:@"money"] isEqual:[NSNull null]]){
// logic
}
反正我是从来没见过别的语言里有这么恶心的非空判断
用category来解决
最后是写了一个NSDictionary的category来解决这个问题,只有当key存在,且key对应的value非空,才返回true
// judge nil
if(![dict objectForKey:key]){
return NO;
}
id obj = [dict objectForKey:key];// judge NSNull
return ![obj isEqual:[NSNull null]];
分享到:
相关推荐
let customKey = CustomClass(value: "example") let dictionary = [customKey: "This is the value"] ``` 4. **注意事项** - 确保`isEqual:`和`hash`方法的实现遵循等价性原则:如果两个对象相等(`isEqual:`...
1.字典使用Key-Value的形式储存数据,是关键字及其定义(描述)的集合 2.字典中的对象储存没有顺序,使用key来表示每个对象,key唯一,Value值可相同 3.字典里Value值在前,key在后 Cocoa中的实现字典的集合...
NSDictionary *dict = @{@"key1": @"value1", @"key2": @"value2"}; // 序列化到NSData NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dict]; ``` 2. **NSData转回NSDictionary**: 将NSData...
if let key = currentKey, let value = currentValue { resultDictionary[key] = value } } } ``` 创建解析器实例并启动解析: ```swift let parser = XMLToDictionaryParser() let xmlData = "<root>...
在iOS开发中,NSDictionary是Objective-C中的一个核心数据结构,它是Foundation框架的一部分,用于存储键值对(key-value pairs)的数据集合。这个压缩包“NSDictionary.zip”可能包含了一个示例项目或者教学资源,...
let dictionary: [String: Any] = ["key1": "value1", "key2": "value2"] do { let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: []) // 保存或发送 jsonData } catch { print(...
标题提到的"OC Extension DelectedDicNull(判断字典中key是否有值)"是一个OC扩展方法,专门用于处理字典中可能存在的`nil`值。 在Objective-C中,`NSDictionary`是不可变的数据结构,它存储键值对,其中键必须是`...
NSDictionary-NilSafe, 发光时我们如何让NSDictionary安全 nsdictionary-nilsafe在发光的时候我们如何使NSDictionary安全,更多的在发光科技博客上阅读。 示例要运行示例项目,克隆 repo,然后从示例目录中运行 pod ...
object-c基础语法NSDictionary, 适合初学者,主要学习字典的操作,包括字典创建、长度、通过KEY找到value、获取所有key、获取所有value、以及可变字典的定义、可变字典添加值、可变字典的删除等
NSDictionary *originalDict = @{@"key1": @1, @"key2": @"" , @"key3": [NSNull null], @"key4": @4}; NSMutableDictionary *filteredDict = [NSMutableDictionary dictionaryWithCapacity:originalDict.count]; ...
subscript(safe key: Key) -> Value? { return containsKey(key) ? self[key] : nil } } ``` 此外,字典中可能会遇到NSNull对象,因为某些API返回的字典中可能存在空值,而用NSNull来表示。我们需要在处理字典时...
- NSDictionary 是一组键值对(Key-Value)的不可变集合,每个键(Key)都是唯一的,且对应一个值(Value)。我们可以通过键来查找对应的值。注意,Dictionary中的顺序是不确定的。 - NSMutableDictionary 是 ...
NSDictionary *dictionary = @{@"key": @"value"}; NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error]; if (!error) { ...
根据条件查询字段 返回的数组是字典( @[@{key:value},@{key:value}] ) ,where形式 @[@"key",@"=",@"value",@"key",@">=",@"value"] */ -(NSArray*)queryWithTableName:(NSString*)name keys:(NSArray*)keys ...
在Objective-C中,`NSDictionary`是用于存储键值对的核心数据结构。自定义键类时,需要遵循一些关键点以确保正确性和效率。本篇文章将深入探讨这些注意事项,旨在帮助开发者更好地理解和使用自定义键来操作`...
`NSDictionary`提供了丰富的API用于键值查询,如`objectForKey:`方法可以返回指定键对应的值,如果键不存在则返回`nil`。此外,`containsObjectForKey:`可用于检查字典是否包含特定的键。对于字典的遍历,`allKeys`...
M13OrderedDictionary, 带有有序对象和键的NSDictionary M13OrderedDictionaryM13OrderedDictionary是NSArray和NSDictionary之间的交叉。 它包含一个有序的对象和键列表。 所有这些都可以通过索引或者键访问。 这里...
NSString NSArray NSDictionary 方法名释义
在Objective-C中,NSNumber和NSDictionary是两个非常重要的基础类,它们在编程中扮演着不可或缺的角色。即使随着Swift的兴起,Objective-C仍然是许多现有项目和开发者的主要工具,因此了解这两个类的用法至关重要。 ...
2. 使用`initWithObjects:forKeys:`方法,例如:`NSDictionary *dict = [[NSDictionary alloc] initWithObjects:@[@"value1", @"value2"] forKeys:@[@"key1", @"key2"]];`。 **二、访问和修改字典** 1. `...