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


Answers:


1156

您可以检查是否[string length] == 0。这将检查它是否是有效但为空的字符串(@“”)以及是否为nil,因为调用lengthnil也会返回0。


12
有一些非常罕见的NSStrings会导致错误的否定(说实际的目的是,字符串不是空的)。考虑@"\u200B"(仅由Unicode字符ZERO WIDTH SPACE组成。将其打印出来将打印0个字符(使用等宽字体验证),但是string.length将给出1。还有其他Unicode字符(例如OBJECT REPLACEMENT CHARACTER)也具有相同的行为。获得后者在解析时PDF文本。
fzwo

43
@fzwo不必大惊小怪,但是从理论上讲,它不会给出错误的否定。它的行为完全符合您的预期。您对内容的解释ZERO WIDTH SPACE并不重要,因为@"\u200B" 仍然一个字符,因此,如果您测试字符串是否为空,则说明不是因为其中包含一个字符。遵循Unicode标准只是无法打印。
bmeulmeester 2014年

2
当然,从技术上讲这是正确的,我没有在争论。我只想提醒您,这可能不会表现出预期或预期的行为,这就是为什么我写“出于实际目的”。它取决于“空”的预期含义。
fzwo 2014年

4
这不是一个假阴性。“零值空间”是与其他字符一样的Unicode字符。如果与您的应用相关,那只是“值得记住”。(大思维,fzwo!)
Fattie

2
让我知道我是否错了,但我想您也可以省略== 0部分,并在前面加上一个否定项:![string length]。似乎更干净。
damirstuhec 2014年

126

马克的答案是正确的。但是,我将借此机会包括指向威尔·希普利(Wil Shipley)概括的指针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);
}

26
如果您想对此进行概括,则可以将此逻辑实现为NSObject上的类别,而不是使用此处所示的静态方法。
Brad The App Guy

16
奇怪的是,这实际上并不检查[NSNull null]。
Peter N Lewis

14
如果您处在不知道要检查的对象类型的情况下,我想这是可行的。但是,我建议如果您不知道对象是NSData还是NSArray,则会遇到更大的问题。调用之后,您的下一个宏是什么condenseToSingleNSData(id something)?expandToNSArray(id东西)?迟早,您会问自己要处理的是哪种类,最好是在第一次参考时进行。
Brane 2012年

1
@BradSmith,可以为其创建一个类别,但由于不会调用该方法,因此不会计入nil值。例如,如果thing = nil,则不会调用[thing IsEmpty],并且始终返回false / NO。要检查是否为零,需要有一个参数。零个对象无法通过类别将其自身比较为零。
克里斯,

3
@chris然后可以将类别方法更改为-isNotEmpty:)
nielsbot 2013年

93

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

这段代码清除了字符串两侧的所有空格:

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

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

#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]

现在您可以使用:

NSString *emptyString = @"   ";

if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");

3
为什么在不需要宏时使用宏?在这种情况下,牺牲任何类型的安全性都没有真正的好处。
EM

为方便起见,如果您想每次检查一个字符串是否为空,都可以编写“ [object stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]”。
SEQOY开发团队

18
最好由一个NSString类别来提供服务,该类别添加一个名为的方法trimmedString,该方法完全可以完成您编写的内容。
Dave DeLong 2010年

2
请注意,Apple whitespaceCharacterSet不包含换行符!这里有一个类我写,包括trim和其他一些有用的方法:github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/...
AlexChaffee

@EM我不喜欢宏,但是我不理解您对类型安全的关注。在编译过程中,宏将被其内容替换,因此,如果您使用不同于NSString的方式调用宏,则仍会从编译器收到消息。无论如何,分类会更好。
Zmaster

32

我见过的最好的解决方案之一(比Matt G更好)是我在一些Git Hub存储库(Wil Shipley的一个,但是找不到链接)中获得的改进的内联功能:

// 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);
}

2
这是威尔·希普利(Wil Shipley)的作品。仅供参考,您可以将[thing isKindOfClass:[NSNull class]]更改为just(thing == [NSNull null])
Steve N

ew...。正是我想要的。我很生气,试图找出为什么我的“ cellForRowAtIndexPath”函数由于空字符串而崩溃(并且我无法抓住问题)。此功能可以完美解决。
迈克·格莱德希尔

@Brane评论的副本:如果您处在不知道要检查的对象类型的情况下,我想这condenseToSingleNSData(id thing)expandToNSArray(id thing)
心教堂

16

您最好使用以下类别:

@implementation NSString (Empty)

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

@end

6
该定义将导致字符串“ / r / n / r / n”为空,但显然不是-包含空格。您的函数实际上是:-(BOOL)isWhitespace(NSString *);
JBR威尔金森,2010年

6
一个必然的结果。我实现了这一类别,但有一个转折。如果在nil字符串上调用此函数,则永远不会调用此函数,并且会返回NO(或计算为NO的值)作为返回值。然后您认为它不为空...如果名称为isFilled或类似名称,这可能会起作用。

我猜正确的类别应该是:@implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end 作为马克和凯尔的答案的结合。
palme 2013年

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

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


最好的解决方案,因为a)是实例方法,并且b)类别c)零的情况由'isNotEmpty'Thx处理!
丹尼斯

好主意,太糟糕了,-(BOOL)isEmpty{ return ![self isNotEmpty]}将无法在类别上使用。
Alston 2015年

@Brane评论的副本:如果您处在不知道要检查的对象类型的情况下,我想这condenseToSingleNSData(id thing)expandToNSArray(id thing)
心教堂

11

另一个选择是检查是否等于@""isEqualToString:例如:

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

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;
}

请查看stackoverflow.com/questions/21605075/…上的评论,以了解为什么这是错误的。还有什么比这里的其他答案更好呢?
Popeye

6

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

方法1:

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

方法2:

if ([yourString length] == 0) {
    // Empty yourString
} else {
    // yourString is not empty
}

6

迅捷版

即使这是一个Objective C问题,我也需要NSString在Swift中使用,因此我还将在此处提供答案。

let myNSString: NSString = ""

if myNSString.length == 0 {
    print("String is empty.")
}

或者,如果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.")
    }
}

普通的Swift String版本是

let myString: String = ""

if myString.isEmpty {
    print("String is empty.")
}

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


5

可能这个答案是已经给出的答案的重复,但是我没有按照检查条件的顺序进行任何修改和更改。请参考以下代码:

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

这是一个类别,您可以在此处查看如何创建它:goo.gl/bRcfn7。我喜欢这个类别的想法
Daniel Gomez Rico 2014年

不,我们不能说这是类别。如果此函数是在NSString类的类别下实现的,则它是类别。否则,无论我们在哪里实现,都可以使用类名调用此方法。就像Bool isEmptyStr = [MyClassName isStringEmpty:str]一样,但是,如果我们在类别下进行声明,它将更好。因为不知何故,我们还需要利用类别的优势。
iDevAmit 2014年

4

您可以使用以下方法检查您的字符串是否为空:

+(BOOL) isEmptyString : (NSString *)string
{
    if([string length] == 0 || [string isKindOfClass:[NSNull class]] || 
       [string isEqualToString:@""]||[string  isEqualToString:NULL]  ||
       string == nil)
     {
        return YES;         //IF String Is An Empty String
     }
    return NO;
}

最佳实践是使一个共享类成为UtilityClass并添加此方法,以便您可以通过在整个应用程序中对其进行调用来使用此方法。


4

您有2种方法检查字符串是否为空:

假设您的字符串名称是NSString *strIsEmpty

方法1:

if(strIsEmpty.length==0)
{
    //String is empty
}

else
{
    //String is not empty
}

方法2:

if([strIsEmpty isEqualToString:@""])
{
    //String is empty
}

else
{
    //String is not empty
}

选择上述任何一种方法,然后了解string是否为空。


3

只需检查您的字符串长度

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

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

快乐的编码...


我已经使用了很多次了。完全不需要扩展名,类别和其他内容。
pnizzle '18

2

这对我来说是魅力

如果NSStrings

if ([s isKindOfClass:[NSNull class]] || s == nil || [s isEqualToString:@""]) {

    NSLog(@"s is empty");

} else {

    NSLog(@"s containing %@", s);

}

2

因此,除了检查字符串长度小于1的基本概念外,深入考虑上下文非常重要。人类或计算机等语言可能对空字符串有不同的定义,并且在这些相同的语言内,其他上下文可能会进一步更改含义。

假设空字符串表示“在当前上下文中不包含任何重要字符的字符串”。

这可能是视觉上的意思,因为属性字符串中的颜色和背景颜色相同。有效地为空。

这可能意味着没有意义的字符。所有的点或所有的破折号或所有下划线可能被认为是空的。此外,如果没有有意义的有效字符,则可能意味着字符串没有读者理解的字符。它们可以是语言或characterSet中定义为对读者无意义的字符。我们可以用不同的方式定义它,以说该字符串在给定的语言中没有已知的单词。

我们可以说空是渲染字形中负空间百分比的函数。

甚至没有一般视觉表示的一系列不可打印字符也不是真正的空。想到控制字符。尤其是低ASCII范围(我很惊讶没有人提到它们,因为它们占用了很多系统并且没有空格,因为它们通常没有字形和视觉指标)。但是字符串长度不为零。

结论。长度不是这里唯一的度量。上下文集合成员身份也很重要。

字符集成员资格是非常重要的常见附加措施。有意义的序列也是相当普遍的序列。(认为​​SETI或crypto或captchas)还存在其他更抽象的上下文集。

因此,在基于长度或空格假设字符串为空之前,请仔细考虑。


2

非常有用的帖子,添加了NSDictionary支持以及一个小的更改

static inline BOOL isEmpty(id thing) {
    return thing == nil
    || [thing isKindOfClass:[NSNull class]]
    || ([thing respondsToSelector:@selector(length)]
        && ![thing respondsToSelector:@selector(count)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [thing count] == 0);
}

@Brane评论的副本:如果您处在不知道要检查的对象类型的情况下,我想这condenseToSingleNSData(id thing)expandToNSArray(id thing)
心教堂

2
- (BOOL)isEmpty:(NSString *)string{
    if ((NSNull *) string == [NSNull null]) {
        return YES;
    }
    if (string == nil) {
        return YES;
    }
    if ([string length] == 0) {
        return YES;
    }
    if ([[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) {
        return YES;
    }
    if([[string stringByStrippingWhitespace] isEqualToString:@""]){
        return YES;
    }
    return NO;
}

1
前三个条件是多余的,您尚未包括stringByStrippingWhitespace
mattsven '16

2

最好的方法是使用类别。
您可以检查以下功能。其中具有所有要检查的条件。

-(BOOL)isNullString:(NSString *)aStr{
        if([(NSNull *)aStr isKindOfClass:[NSNull class]]){
            return YES;
        }
        if ((NSNull *)aStr  == [NSNull null]) {
            return YES;
        }
        if ([aStr isKindOfClass:[NSNull class]]){
            return YES;
        }
        if(![[aStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]){
            return YES;
        }
        return NO;
    }

1

无论如何,最好的方法是检查给定字符串的长度。如果您的字符串是myString,则代码为:

    int len = [myString length];
    if(len == 0){
       NSLog(@"String is empty");
    }
    else{
      NSLog(@"String is : %@", myString);
    }


1

检查一下:

if ([yourString isEqualToString:@""])
{
    NsLog(@"Blank String");
}

要么

if ([yourString length] == 0)
{
    NsLog(@"Blank String");
}

希望这会有所帮助。


1

您可以使用以下命令轻松检查string是否为空:

if ([yourstring isEqualToString:@""]) {
    // execute your action here if string is empty
}

1

我已经使用以下代码检查了一个空字符串:

//Check if we have any search terms in the search dictionary.
if( (strMyString.text==(id) [NSNull null] || [strMyString.text length]==0 
       || strMyString.text isEqual:@"")) {

   [AlertView showAlert:@"Please enter a valid string"];  
}


1
//Different validations:
 NSString * inputStr = @"Hey ";

//Check length
[inputStr length]

//Coming from server, check if its NSNull
[inputStr isEqual:[NSNull null]] ? nil : inputStr

//For validation in allowed character set
-(BOOL)validateString:(NSString*)inputStr
{
    BOOL isValid = NO;
    if(!([inputStr length]>0))
    {
        return isValid;

    }

    NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@".-"];
    [allowedSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
    if ([inputStr rangeOfCharacterFromSet:[allowedSet invertedSet]].location == NSNotFound)
    {
        // contains only decimal set and '-' and '.'

    }
    else
    {
        // invalid
        isValid = NO;

    }
    return isValid;
}

0

您可以通过以下两种方式获得空字符串:

1)@“” //不包含空格

2)@“” //包含空格

从技术上讲,两个字符串都是空的。我们可以只用一个条件就可以写两件事

if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
    NSLog(@"Empty String");
}
else
{
    NSLog(@"String contains some value");
}

0

尝试以下

NSString *stringToCheck = @"";

if ([stringToCheck isEqualToString:@""])
{
   NSLog(@"String Empty");
}
else
{
   NSLog(@"String Not Empty");
}

-1
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
    NSLog(@"String is empty");
}
else{
    NSLog(@"String is not empty");
}    

1
空检查必须是第一个。str.length如果str为null,将抛出异常。
杰弗里·托马斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.