short cut technique for finding null value from Di

2019-06-11 16:08发布

问题:

I have 100 key and value in nsmutabledictornary and i want to check that any value have null or not. Do you have any short function or technique?

I don't want to multiple line code like check every key and value. Your answer would be appreciated.

回答1:

This code will give you the set of keys which have (non)null values. You can't store actual nil values in a dictionary, so [NSNull null] is assumed. The predicate is trivially alterable to any other condition.

NSDictionary *d = @{ @"a" : @"1", @"b" : [NSNull null] };

NSSet *nullKeys = [d keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) {
    return [d[key] isKindOfClass:[NSNull class]];
}];

NSSet *nonnullKeys = [d keysOfEntriesPassingTest:^BOOL(NSString *key, id obj, BOOL *stop) {
    return [d[key] isKindOfClass:[NSNull class]] == NO;
}];

From here, you can use the keys to generate a corresponding dictionary, if needed.

NSMutableDictionary *nonNullDict = [NSMutableDictionary dictionary];
[d enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
    if ([nonnullKeys contains:key]) {
        nonNullDict[key] = obj;
    }
}];

If you don't need a separate list of keys, and just need the filtered dictionary, skip the first step and modify the second part to read as follows:

NSMutableDictionary *nonNullDict = [NSMutableDictionary dictionary];
[d enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
    if ([obj isKindOfClass:[NSNull null]] == NO) {
        nonNullDict[key] = obj;
    }
}];


回答2:

Write category on NSDictionary it will provide you null free dictionary. Here is the category I have written for myself.

code for .h file (interface)

#import <Foundation/Foundation.h>

@interface NSDictionary (CheckNull)
{

}

- (NSDictionary *)nullFreeDictionary;

@end

Code for .m file. (implementation)

#import "NSDictionary+CheckNull.h"

@implementation NSDictionary (CheckNull)
- (NSDictionary *) nullFreeDictionary
{
    NSMutableDictionary *tempDictionary = [self mutableCopy];
    for (NSString *key in tempDictionary.allKeys) {
        NSString *value = [tempDictionary valueForKey:key];
        if ([value isKindOfClass:[NSString class]]) {
            if (value == (id)[NSNull null] || value == nil || value.length == 0) {
                [tempDictionary setValue:@"" forKey:key];
            }
        }
    }
    return tempDictionary;
}

Call null free method on your dictionary using above category.

  NSDictionary *dict = [dict nullFreeDictionary];


回答3:

//To remove NULL from Dictionary

-(NSMutableDictionary *)removeNullFromDictionary : (NSMutableDictionary *)dict
{
    //    if (![dict isKindOfClass:[NSMutableDictionary class]])
    //    {
    //    }
    dict = [[NSMutableDictionary alloc] initWithDictionary:dict];

    for (NSString * key in [dict allKeys])
    {
        if ([dict[key] isKindOfClass:[NSNull class]])
        {
            [dict setValue:@"" forKey:key];
        }
        else if ([dict[key] isKindOfClass:[NSMutableDictionary class]]||[dict[key] isKindOfClass:[NSDictionary class]])
        {
            dict[key] = [self removeNullFromDictionary:[NSMutableDictionary dictionaryWithDictionary:dict[key]]];
        }
        else if ([dict[key] isKindOfClass:[NSMutableArray class]]||[dict[key] isKindOfClass:[NSArray class]])
        {
            dict[key] = [self removeNullFromArray:[NSMutableArray arrayWithArray:dict[key]]];
        }
    }

    return dict;
}

//To remove NULL from Array

-(NSMutableArray *)removeNullFromArray : (NSMutableArray *)arr
{
    //    if (![arr respondsToSelector:@selector(addObject:)])
    //    {
    //        arr = [[NSMutableArray alloc] initWithArray:arr];
    //    }
    arr = [[NSMutableArray alloc] initWithArray:arr];
    for (int cnt = 0; cnt<[arr count]; cnt++)
    {
        if ([arr[cnt] isKindOfClass:[NSNull class]])
        {
            arr[cnt] = @"";
        }
        else if ([arr[cnt] isKindOfClass:[NSMutableDictionary class]]||[arr[cnt] isKindOfClass:[NSDictionary class]])
        {
            arr[cnt] = [self removeNullFromDictionary:[NSMutableDictionary dictionaryWithDictionary:arr[cnt]]];
        }
        else if ([arr[cnt] isKindOfClass:[NSMutableArray class]]||[arr[cnt] isKindOfClass:[NSArray class]])
        {
            arr[cnt] = [self removeNullFromArray:[NSMutableArray arrayWithArray:arr[cnt]]];
        }
    }
    return arr;
}