`

NSDictionary判断key存在,且value非空

 
阅读更多

这几天写一段数据迁移脚本,各种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]];


分享到:
评论

相关推荐

    自定义类在NSdictionary当key的示例

    let customKey = CustomClass(value: "example") let dictionary = [customKey: "This is the value"] ``` 4. **注意事项** - 确保`isEqual:`和`hash`方法的实现遵循等价性原则:如果两个对象相等(`isEqual:`...

    NSDictionary_NSMutableDictionary

    1.字典使用Key-Value的形式储存数据,是关键字及其定义(描述)的集合 2.字典中的对象储存没有顺序,使用key来表示每个对象,key唯一,Value值可相同 3.字典里Value值在前,key在后 Cocoa中的实现字典的集合...

    ios demo,NSData和NSDictionary之间的相互转换的实现案例

    NSDictionary *dict = @{@"key1": @"value1", @"key2": @"value2"}; // 序列化到NSData NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dict]; ``` 2. **NSData转回NSDictionary**: 将NSData...

    NSDictionary,JSON和XML互相转换

    if let key = currentKey, let value = currentValue { resultDictionary[key] = value } } } ``` 创建解析器实例并启动解析: ```swift let parser = XMLToDictionaryParser() let xmlData = "<root>...

    NSDictionary.zip

    在iOS开发中,NSDictionary是Objective-C中的一个核心数据结构,它是Foundation框架的一部分,用于存储键值对(key-value pairs)的数据集合。这个压缩包“NSDictionary.zip”可能包含了一个示例项目或者教学资源,...

    NSData与NSDictionary、JSON数据类型相互转换

    let dictionary: [String: Any] = ["key1": "value1", "key2": "value2"] do { let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: []) // 保存或发送 jsonData } catch { print(...

    OC Extension DelectedDicNull(判断字典中key是否有值).zip

    标题提到的"OC Extension DelectedDicNull(判断字典中key是否有值)"是一个OC扩展方法,专门用于处理字典中可能存在的`nil`值。 在Objective-C中,`NSDictionary`是不可变的数据结构,它存储键值对,其中键必须是`...

    NSDictionary-NilSafe, 发光时我们如何让NSDictionary安全.zip

    NSDictionary-NilSafe, 发光时我们如何让NSDictionary安全 nsdictionary-nilsafe在发光的时候我们如何使NSDictionary安全,更多的在发光科技博客上阅读。 示例要运行示例项目,克隆 repo,然后从示例目录中运行 pod ...

    iphone 开发学习基础NSDictionary

    object-c基础语法NSDictionary, 适合初学者,主要学习字典的操作,包括字典创建、长度、通过KEY找到value、获取所有key、获取所有value、以及可变字典的定义、可变字典添加值、可变字典的删除等

    oc.zip_NSArray_NSDictionary_去空

    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来表示。我们需要在处理字典时...

    NSArray,NSSet,NSEnumerator,NSDictionary及对应Mutable介绍

    - NSDictionary 是一组键值对(Key-Value)的不可变集合,每个键(Key)都是唯一的,且对应一个值(Value)。我们可以通过键来查找对应的值。注意,Dictionary中的顺序是不确定的。 - NSMutableDictionary 是 ...

    ios demo,NSDictionary toJSONString,字典转换到JSONString

    NSDictionary *dictionary = @{@"key": @"value"}; NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error]; if (!error) { ...

    ios-封装了FMDB,用户只需要关心字段和字段值,逻辑完全不要关心,用起来及其方便快捷,非常适合新手.zip

    根据条件查询字段 返回的数组是字典( @[@{key:value},@{key:value}] ) ,where形式 @[@"key",@"=",@"value",@"key",@">=",@"value"] */ -(NSArray*)queryWithTableName:(NSString*)name keys:(NSArray*)keys ...

    (objective-c 自定义 NSDictionary 键类的注意事项)工程

    在Objective-C中,`NSDictionary`是用于存储键值对的核心数据结构。自定义键类时,需要遵循一些关键点以确保正确性和效率。本篇文章将深入探讨这些注意事项,旨在帮助开发者更好地理解和使用自定义键来操作`...

    NSDictionary帮助文档

    `NSDictionary`提供了丰富的API用于键值查询,如`objectForKey:`方法可以返回指定键对应的值,如果键不存在则返回`nil`。此外,`containsObjectForKey:`可用于检查字典是否包含特定的键。对于字典的遍历,`allKeys`...

    M13OrderedDictionary, 带有有序对象和键的NSDictionary.zip

    M13OrderedDictionary, 带有有序对象和键的NSDictionary M13OrderedDictionaryM13OrderedDictionary是NSArray和NSDictionary之间的交叉。 它包含一个有序的对象和键列表。 所有这些都可以通过索引或者键访问。 这里...

    NSString NSArray NSDictionary 方法名释义

    NSString NSArray NSDictionary 方法名释义

    Objective-C中NSNumber与NSDictionary的用法简介

    在Objective-C中,NSNumber和NSDictionary是两个非常重要的基础类,它们在编程中扮演着不可或缺的角色。即使随着Swift的兴起,Objective-C仍然是许多现有项目和开发者的主要工具,因此了解这两个类的用法至关重要。 ...

    oc中字典的主要内容

    2. 使用`initWithObjects:forKeys:`方法,例如:`NSDictionary *dict = [[NSDictionary alloc] initWithObjects:@[@"value1", @"value2"] forKeys:@[@"key1", @"key2"]];`。 **二、访问和修改字典** 1. `...

Global site tag (gtag.js) - Google Analytics