如何在Objective C中测试字符串是否为空?

Jam*_*een 640 objective-c nsstring ios

如何NSString在Objective C中测试a是否为空?

Mar*_*eau 1137

你可以检查一下[string length] == 0.这将检查它是否是有效但空字符串(@"")以及它是否为零,因为调用lengthnil也将返回0.

  • @fzwo不是一个屁股,但理论上它不会给出假阴性.它的行为**正如您所期望的那样**.你对'ZERO WIDTH SPACE'的解释并不重要,因为`@"\ u200B"`**是**一个字符,所以如果你测试字符串为空,它会说它不是因为里面有一个角色.根据Unicode标准,它无法打印. (42认同)
  • 有一些非常罕见的NSStrings,这将导致假阴性(说实际上,当它是真的时,字符串不是空的).考虑`@"\ u200B"`(仅由Unicode字符组成[ZERO WIDTH SPACE](http://www.fileformat.info/info/unicode/char/200B/index.htm).打印出来将打印0个字符(使用等宽字体验证),但string.length将给出1.还有其他Unicode字符(如[OBJECT REPLACEMENT CHARACTER](http://www.fileformat.info/info/unicode/char/fffc/encoding.htm)同样表现的行为.解析PDF文本时可能会得到后者. (12认同)
  • 这不是假阴性."零价值空间"是一个像任何其他人一样的unicode角色.如果与您的应用相关,它只是"值得记住".(很好的想法,fzwo!) (4认同)
  • 当然,这在技术上是正确的,我不是在争论.我只是想提醒一下,这可能不会表现出预期的或预期的行为,这就是为什么我写"出于实际目的".这取决于"空"的意图. (2认同)
  • 让我知道如果我错了,但我认为你也可以省略== 0部分并在前面添加一个否定:``![string length]``.看起来更干净. (2认同)
  • @damirstuhec这可能是较少的字符,但它也不太可读.`if([string length] == 0)`将被读作"if string length为0",而`if(![string length])`将被读作"if not string length".如果不熟悉该代码的人读取它,则第二种选择需要更长时间才能理解. (2认同)
  • @Brian我同意!8个月后我真的喜欢``if(string.length == 0)``. (2认同)
  • 如果字符串为NULL,则会失败,因为您无法在NULL上调用长度. (2认同)

Mat*_*t G 126

马克的回答是正确的.但我会借此机会包括一个指向威尔希普利的广义的指针isEmpty,他在博客上分享了这个指针:

static inline BOOL IsEmpty(id thing) {
return thing == nil
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *)thing count] == 0);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要这个非常概括,可以在NSObject上将这个逻辑实现为一个类,而不是使用静态方法,如下所示. (26认同)
  • 奇怪的是,这实际上并不检查[NSNull null]. (16认同)
  • 如果您遇到的情况是您不知道要检查的对象类型,我猜这是有效的.但是我建议如果你不知道某个对象是NSData还是NSArray,那么你就会遇到更大的问题.这个调用之后你的下一个宏是什么,firseToSingleNSData(id thing)?expandToNSArray(id thing)?迟早,你会问你正在处理什么样的课程,最好在第一次参考时这样做. (14认同)
  • @chris然后你可以将类别方法更改为`-isNotEmpty` :) (3认同)

SEQ*_*eam 93

第一种方法是有效的,但如果您的字符串有空格(@" "),则不起作用.因此,在测试之前必须清除此空白区域.

此代码清除字符串两侧的所有空格:

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
Run Code Online (Sandbox Code Playgroud)

一个好主意是创建一个宏,因此您不必键入此怪物行:

#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

NSString *emptyString = @"   ";

if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
Run Code Online (Sandbox Code Playgroud)

  • 更好的是由一个`NSString`类别提供,它添加了一个名为`trimmedString`的方法,它完全按照你所编写的方式执行. (18认同)
  • 为什么在不需要时使用宏?在这种情况下,牺牲任何排序类型的安全性都没有真正的好处. (3认同)
  • 请注意,Apple的`whitespaceCharacterSet`不包含换行符!这是我写的一个类别,包括`trim`和其他一些有用的方法:https://github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m https://github.com/alexch/unsuck/斑点/主/ unsuckTests /的NSString%2BUnsuckTests.m (2认同)

Rob*_*Rob 32

一个我所见过的最好的解决方案(比马特G公司的一个更好的)是这种改进的内联函数我拿起一些Git的枢纽回购(威尔·希普利的一个,但我不能找到链接):

// Check if the "thing" passed is empty
static inline BOOL isEmpty(id thing) {
    return thing == nil
    || [thing isKindOfClass:[NSNull class]]
    || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是Wil Shipley的工作.仅供参考,您可以将[thing isKindOfClass:[NSNull class]]改为just(thing == [NSNull null]) (2认同)

小智 16

你应该更好地使用这个类别:

@implementation NSString (Empty)

    - (BOOL) isWhitespace{
        return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);
    }

@end
Run Code Online (Sandbox Code Playgroud)

  • 该定义将包括字符串"/ r/n/r/n"为空,当它显然不是 - 它包含空格.你的功能是: - (BOOL)isWhitespace(NSString*); (6认同)
  • 这是一个必然结果.我实现了这个类别,并且有一个转折点.如果你在一个nil字符串上调用它,则永远不会调用此函数,并且返回NO(或评估为NO)作为返回值.然后你认为它不是空的...如果名称是isFilled或类似的东西,这可能会有用. (6认同)

use*_*951 12

我把它说:

@implementation NSObject (AdditionalMethod)
-(BOOL) isNotEmpty
{
    return !(self == nil
    || [self isKindOfClass:[NSNull class]]
    || ([self respondsToSelector:@selector(length)]
        && [(NSData *)self length] == 0)
    || ([self respondsToSelector:@selector(count)]
        && [(NSArray *)self count] == 0));

};
@end
Run Code Online (Sandbox Code Playgroud)

问题是如果self为nil,则永远不会调用此函数.它将返回false,这是期望的.


Man*_*ani 11

只需将您的字符串传递给以下方法:

+(BOOL)isEmpty:(NSString *)str
{
    if(str.length==0 || [str isKindOfClass:[NSNull class]] || [str isEqualToString:@""]||[str  isEqualToString:NULL]||[str isEqualToString:@"(null)"]||str==nil || [str isEqualToString:@"<null>"]){
        return YES;
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)


cho*_*own 10

另一种选择是,以检查它是否等于@""isEqualToString:像这样:

if ([myString isEqualToString:@""]) {
    NSLog(@"myString IS empty!");
} else {
    NSLog(@"myString IS NOT empty, it is: %@", myString);
}
Run Code Online (Sandbox Code Playgroud)


Aks*_*Aks 7

只需检查您的字符串长度

 if (!yourString.length)
 {
   //your code  
 }
Run Code Online (Sandbox Code Playgroud)

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

快乐编码...


Sam*_*han 6

只需使用if else以下条件之一:

方法1:

if ([yourString isEqualToString:@""]) {
        // yourString is empty.
    } else {
        // yourString has some text on it.
    }
Run Code Online (Sandbox Code Playgroud)

方法2:

if ([yourString length] == 0) {
    // Empty yourString
} else {
    // yourString is not empty
}
Run Code Online (Sandbox Code Playgroud)


Sur*_*gch 6

Swift版本

即使这是一个Objective C问题,我需要NSString在Swift中使用,所以我也会在这里提供一个答案.

let myNSString: NSString = ""

if myNSString.length == 0 {
    print("String is empty.")
}
Run Code Online (Sandbox Code Playgroud)

或者如果NSString是可选的:

var myOptionalNSString: NSString? = nil

if myOptionalNSString == nil || myOptionalNSString!.length == 0 {
    print("String is empty.")
}

// or alternatively...
if let myString = myOptionalNSString {
    if myString.length != 0 {
        print("String is not empty.")
    }
}
Run Code Online (Sandbox Code Playgroud)

正常的Swift String版本是

let myString: String = ""

if myString.isEmpty {
    print("String is empty.")
}
Run Code Online (Sandbox Code Playgroud)

另请参阅:检查Swift中的空字符串?


iDe*_*mit 5

可能这个答案是已经给出的答案的副本,但我按照检查条件的顺序做了一些修改和更改.请参考以下代码:

+(BOOL)isStringEmpty:(NSString *)str
    {
        if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
            return YES;
       }
        return NO;
    }
Run Code Online (Sandbox Code Playgroud)