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

2020-04-26  本文已影响0人  勇往直前888

背景介绍

企业微信截图_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中考虑的不多。
上一篇下一篇

猜你喜欢

热点阅读