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

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

290998 次浏览

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

Marc的答案是正确的。但我将借此机会包括一个指向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);
}

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

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

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

一个好主意是创建一个宏,这样你就不必键入这个怪物行:

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

现在您可以使用:

NSString *emptyString = @"   ";


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

你最好使用这个类别:

@implementation NSString (Empty)


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


@end

我见过的最好的解决方案之一(比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);
}

我把这个:

@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,这是期望的。

另一种选择是检查它是否等于@""isEqualToString:,如下所示:

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

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

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

只需使用ifelse条件之一,如下所示:

方法一:

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

方法二:

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

非常有用的帖子,添加NSDiction支持以及一个小变化

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

这对我来说很有魅力

如果NSStrings

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


NSLog(@"s is empty");


} else {


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


}
if (string.length == 0) stringIsEmpty;
if( [txtMobile.text length] == 0 )
{
[Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}

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

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

检查这个:

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

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

希望这能有所帮助。

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

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

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

这可能意味着没有有意义的字符。所有点或所有破折号或所有下划线都可能被视为空。 此外,空有意义的重要字符可能意味着没有读者理解的字符的字符串。 它们可以是一种语言中的字符或被定义为对读者毫无意义的字符集。我们可以稍微不同地定义它,说字符串在给定语言中不形成已知单词。

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

即使是没有一般视觉表示的不可打印字符序列也不是真正的空。控制字符浮现在脑海中。尤其是低ASCII范围(我很惊讶没有人提到这些,因为它们有很多系统并且不是空白,因为它们通常没有字形和视觉度量)。然而字符串长度不是零。

结论。 长度本身并不是唯一的衡量标准。 上下文集成员资格也非常重要。

字符集成员资格是一个非常重要的常见附加度量。 有意义的序列也是一个相当常见的序列。(想想SETI或加密或验证码) 其他更抽象的上下文集也存在。

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

您可以轻松检查字符串是否为空:

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

可能这个答案是已经给出的答案的重复,但是我在检查条件的顺序上做了一些修改和更改。请参考下面的代码:

+(BOOL)isStringEmpty:(NSString *)str {
if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
return YES;
}
return NO;
}
if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
NSLog(@"String is empty");
}
else{
NSLog(@"String is not empty");
}

您可以使用此方法检查您的字符串是否为空或不是我的:

+(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并添加此方法,以便您可以通过在应用程序中调用它来使用此方法。

我使用下面的代码检查了一个空字符串:

//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"];
}

你有两种方法来检查字符串是否为空:

假设你的字符串名是NSString *strIsEmpty

方法一:

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


else
{
//String is not empty
}

方法二:

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


else
{
//String is not empty
}

选择上述任何一种方法并了解字符串是否为空。

就像if([myString isEqual:@""])if([myString isEqualToString:@""])一样简单

Swift版本

尽管这是一个ObjectiveC问题,但我需要在Swift中使用NSString,所以我也会在这里给出答案。

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.")
}
}

正常的SwiftString版本是

let myString: String = ""


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

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

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

最好的方法是使用类别。
您可以检查以下函数。它具有要检查的所有条件。

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

检查你的字符串长度

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

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

编码愉快…

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

您可以通过两种方式拥有空字符串:

1) @"" // 不包含空间

2) @" " // 空间

从技术上讲,两个字符串都是空的。我们可以使用一个条件来编写这两个东西

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

试试以下方法

NSString *stringToCheck = @"";


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

基于多个答案,我创建了一个随时可用的类别,组合了@iDevAmit和@user238824答案。

具体来说,它按以下顺序进行

  1. 检查null/nil
  2. 使用字符串的长度计数检查字符串是否为空。
  3. 检查字符串是否为空格。

页眉

//
//  NSString+Empty.h


#import <Foundation/Foundation.h>


NS_ASSUME_NONNULL_BEGIN


@interface NSString (Empty)
- (BOOL)isEmptyOrWhiteSpacesOrNil;
@end


NS_ASSUME_NONNULL_END


实施

//
//  NSString+Empty.m


#import "NSString+Empty.h"


@implementation NSString (Empty)


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


- (BOOL)isEmptyOrWhiteSpacesOrNil {
if(self == nil || [self isKindOfClass:[NSNull class]] || self.length==0 || [self isWhitespace] == YES) {
return YES;
}
return NO;
}


@end


/*
Credits
1. https://stackoverflow.com/a/24506942/7551807
2. https://stackoverflow.com/a/1963273/7551807
*/


用法: 当然,如果您的字符串为空,该函数将永远不会被触发。第一种情况只是为了增加安全性。我建议在尝试使用此方法之前检查是否为空。

if (myString) {
if [myString isEmptyOrWhiteSpacesOrNil] {
// String is empty
}
} else {
// String is null
}