美文网首页
判断字符串为空实践-2020-04-26

判断字符串为空实践-2020-04-26

作者: 勇往直前888 | 来源:发表于2020-04-26 17:59 被阅读0次

    背景介绍

    • 测试提了一个问题,并且还有截图
    企业微信截图_15877261235935.png
    • 我记得代码中做了判空处理,如果后台没有给具体的字符串,这里应该默认显示“取消”两个字。并且还给出了代码截图,证明我考虑了空字符给默认值的状况。
    企业微信截图_dad475f5-4fab-4342-87b1-a43496189006.png
    • 测试给了网络抓包截图,看后台返回的数据:
    企业微信截图_15878674025442.png

    估计上次测试的时候,后台没这个字段,所以是nil,按照代码,可以显示出默认的”取消“字样。这次后台给了空字符串”“,就直接显示了,导致什么也看不到。

    原因分析

    仅仅通过判断是否为nil来判断后台返回的字符串是否为空是不全面的。不过麻烦的是Object-C中没有字符串判空的现成方法可用。这方面,Java比较方便,提供了isNotBlankisNotEmpty两个方法。比如下面这篇文章介绍的:
    isNotBlank()和isNotEmpty()总结

    解决方案

    第三方库YYKit套件中的YYCategories组件中的NSString+YYAdd.h提供了判空方法:

    /**
     nil, @"", @"  ", @"\n" will Returns NO; otherwise Returns YES.
     */
    - (BOOL)isNotBlank;
    

    上面的代码稍微改一下,”取消“两个字就能出来了。

                        // 取消按钮字符
                        if(prompt.canClose) {
                            NSString *cancelTitle = [prompt.cancelBtnValue isNotBlank]? prompt.cancelBtnValue : @"取消";
                            [alert addAction:[UIAlertAction actionWithTitle:cancelTitle style:UIAlertActionStyleCancel handler:nil]];
                        }
    

    源码分析

    在第三方库的源文件NSString+YYAdd.m中可以看到相关源码

    - (BOOL)isNotBlank {
        NSCharacterSet *blank = [NSCharacterSet whitespaceAndNewlineCharacterSet];
        for (NSInteger i = 0; i < self.length; ++i) {
            unichar c = [self characterAtIndex:i];
            if (![blank characterIsMember:c]) {
                return YES;
            }
        }
        return NO;
    }
    

    这个实现思路还是非常巧妙的。这是个反逻辑思路,默认返回No,也就是空;然后一个字符一个字符查,只要查到一个非空字符,就返回YES

    其他思路

    采用正向思维逻辑判空,也是可以的。只是要自己完成一个工具函数。

    +  (BOOL)isBlankString:(NSString *)aStr {
        if (!aStr) {
            return YES;
        }
        if ([aStr isKindOfClass:[NSNull class]]) {
            return YES;
        }
        NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
        NSString *trimmedStr = [aStr stringByTrimmingCharactersInSet:set];
        if (!trimmedStr.length) {
            return YES;
        }
        return NO;
    }
    
    1. 如果是nil,就是空;
    2. 如果是NSNull,也是空;
    3. 先去掉两边的空格,再看字符串长度;
    #pragma mark 判断是否是字符串
    +(BOOL)isString:(NSString *)string{
        
        if (string == nil) {
            return NO;
        }
        if ([string isKindOfClass:[NSNull class]]) {
            return NO;
        }
        if (![string isKindOfClass:[NSString class]]){
            return NO;
        }
        if ([string isEqualToString:@"null"]) {
            return NO;
        }
        if ([string isEqualToString:@"<null>"]) {
            return NO;
        }
        return YES;
    }
    
    1. 如果是nil,就是空;
    2. 如果是NSNull,也是空; 这两步和第一种方案一样
    3. 如果不是NSString类,也是空;
    4. 如果是字符串@"null",也是空;
    5. 如果是字符串@"<null>",也是空; 第4、5两点在OC中考虑的不多。

    相关文章

      网友评论

          本文标题:判断字符串为空实践-2020-04-26

          本文链接:https://www.haomeiwen.com/subject/ngcjwhtx.html