判断字符串为空实践-2020-04-26
2020-04-26 本文已影响0人
勇往直前888
背景介绍
- 测试提了一个问题,并且还有截图
- 我记得代码中做了判空处理,如果后台没有给具体的字符串,这里应该默认显示“取消”两个字。并且还给出了代码截图,证明我考虑了空字符给默认值的状况。
- 测试给了网络抓包截图,看后台返回的数据:
估计上次测试的时候,后台没这个字段,所以是
nil
,按照代码,可以显示出默认的”取消“字样。这次后台给了空字符串”“,就直接显示了,导致什么也看不到。
原因分析
仅仅通过判断是否为nil
来判断后台返回的字符串是否为空是不全面的。不过麻烦的是Object-C
中没有字符串判空的现成方法可用。这方面,Java
比较方便,提供了isNotBlank
和isNotEmpty
两个方法。比如下面这篇文章介绍的:
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
其他思路
采用正向思维逻辑判空,也是可以的。只是要自己完成一个工具函数。
- 这篇文章是其中一种思路
iOS-判断字符串为空你以为这么简单吗?
+ (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;
}
- 如果是nil,就是空;
- 如果是NSNull,也是空;
- 先去掉两边的空格,再看字符串长度;
- 这篇文章是第二种思路,大致相同,略微有所差异
iOS开发判断数组是否为空
#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;
}
- 如果是
nil
,就是空;- 如果是
NSNull
,也是空; 这两步和第一种方案一样- 如果不是
NSString
类,也是空;- 如果是字符串
@"null"
,也是空;- 如果是字符串
@"<null>"
,也是空; 第4、5
两点在OC
中考虑的不多。