iOS-NSDictionaryOfVariableBindings自动去除字典空值对象

模仿系统的快速生成字典的方法NSDictionaryOfVariableBindings,并过滤掉值为nil的对象或内容全为空格字符串,防止字典crash。

推荐适用场合:网络请求生成参数字典,无需判空。
其他创建字典的地方也可以使用,注意此方法会过滤掉全为空格及@""字符串,如不需要可自行修改。

创建分类文件NSDictionary+Safe

NSDictionary+Safe.m  中代码如下:

#define BZDictionaryOfVariableBindings(...) [NSDictionary _BZDictionaryOfVariableBindings:@"" # __VA_ARGS__, __VA_ARGS__]


@interface NSDictionary (Safe)

/**
 安全获取value值
 
 @param aKey <#aKey description#>
 @return <#return value description#>
 */
- (id)objectForKeyCheck:(id)aKey;

/**
 模仿系统的对象生成字典的宏定义:NSDictionaryOfVariableBindings(...)
 if v1 = @"something"; v2 = nil; v3 = @"something"; v4 = @"";
 ZXDictionaryOfVariableBindings(v1, v2, v3) is equivalent to [NSDictionary dictionaryWithObjectsAndKeys:v1, @"v1", v3, @"v3", nil];
 并且参数的值可为nil,@"", 会自动去除值为nil, @"", @"  "等的对象
 */
+ (NSDictionary *)_BZDictionaryOfVariableBindings:(NSString *)firstArg, ...;

NSDictionary+Safe.h  中代码如下:

#import "NSDictionary+Safe.h"

@implementation NSDictionary (Safe)

- (id)objectForKeyCheck:(id)aKey{
    if ([self.allKeys containsObject:aKey]) {
        return [self objectForKey:aKey];
    }
    NSLog(@"%@", [NSThread callStackSymbols]);
    return nil;
}

+ (NSDictionary *)_BZDictionaryOfVariableBindings:(NSString *)firstArg, ... {
    firstArg = [firstArg stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSArray *keys = [firstArg componentsSeparatedByString:@","];
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:keys.count];
    va_list list;
    if (firstArg) {
        va_start(list, firstArg);
        id arg;
        for (NSString *key in keys) {
            arg = va_arg(list, id);
            if (!arg || [arg isKindOfClass:[NSNull class]]) {
                continue;
            }
            if ([arg isKindOfClass:[NSString class]]) {
                if ([[arg stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] != 0) {
                    [dic setObject:arg forKey:key];
                }
            } else {
                [dic setObject:arg forKey:key];
            }
        }
        va_end(list);
    }
    return dic;
}

拿到后台返回字段,普通的字典添加元素,会crash掉

调用后会发现把nil值过滤掉了不会crash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值