38

我在 NSString 上写了一个小类别,我想知道这个方法是否准确地处理了所有潜在的用例:

更新:澄清——我想确保我不会错过一些涉及字符编码等的奇怪案例。

@implementation NSString (Helpers)

+(BOOL)stringIsNilOrEmpty:(NSString*)aString {
    if (!aString)
        return YES;
    return [aString isEqualToString:@""];
}
@end

示例用法:

-(void) sampleUsage {
    NSString *emptyString = @"";
    NSString *nilString = nil;
    NSAssert([NSString stringIsNilOrEmpty:nilString] == YES, @"String is nil/empty");
    NSAssert([NSString stringIsNilOrEmpty:emptyString] == YES, @"String is nil/empty");
}
@end
4

6 回答 6

132

我只使用下一个条件,甚至不需要类别:

if (!aString.length)
{
    ...
}

使用 Objective-C 理论,给 NIL 的消息将返回 nil 或零,所以基本上你不必测试 nil

于 2013-10-09T09:27:17.697 回答
29

您可以通过删除条件来简化代码:

+(BOOL)stringIsNilOrEmpty:(NSString*)aString {
    return !(aString && aString.length);
}
于 2013-01-23T03:48:14.513 回答
9

@dasblinkenlight 的答案很好,但我将使用的更具可读性的条件检查是:

NSString *string = ...;   // define the string
if ([string length] == 0) {
    // Do stuff with the string
} else {
    // The string is empty or nil here
}

非常简洁,不需要单独的便利函数定义。这很容易记住。

编辑:@Michael G. Emmons 将此作为对该答案的最后评论发布……感谢他,但我将其列为其本身的答案。

于 2014-04-16T12:24:05.843 回答
2

这种“非空或空白”测试的一些示例作为 NSString 上的一个类别。

// Please note that in general I advocate using a prefix on category methods
// to avoid category collisions.  I've not done this here for clarity. 
// The @interface is also excluded from this example for brevity.

@implementation NSString (MyAdditions)

- (BOOL)isNotEmpty
{
  return [self length] != 0;
}

- (BOOL)isNotBlank
{
  if ([self isNotEmpty])
  {
    NSCharacterSet *nonWhitespaceSet = [[NSCharacterSet whitespaceAndNewlineCharacterSet] invertedSet];
    NSRange range = [self rangeOfCharactersFromSet:nonWhitespaceSet];
    return range.location != NSNotFound;
  }

  return NO;
}

@end
于 2014-01-22T03:23:00.973 回答
0

确保在计算长度之前检查空格,修剪空格。

+(BOOL)stringIsNilOrEmpty:(NSString*)aString {
    return !aString || [[aString  stringByTrimmingCharactersInSet:
                    [NSCharacterSet whitespaceCharacterSet]] length] == 0;
}
于 2017-05-26T09:58:11.540 回答
0

只需检查您的字符串长度

> if (!yourString.length){
>     //your code  } a

发给 NIL 的消息将返回 nil 或 0,因此无需测试 nil :)。

快乐的编码...

于 2016-05-27T19:58:11.477 回答