【问题标题】:How do I test if a string is empty in Objective-C?如何在 Objective-C 中测试字符串是否为空?
【发布时间】:2010-10-28 07:19:34
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c nsstring


    【解决方案1】:

    可能这个答案是已经给出的答案的副本,但我在检查条件的顺序上做了很少的修改和更改。请参考以下代码:

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

    【讨论】:

    • 这是一个类别,您可以在此处查看如何创建它:goo.gl/bRcfn7。我喜欢这个类别的想法
    • 不,我们不能说这是类别。如果这个函数是在NSString类的category下实现的,那么就是category。否则,我们可以在我们实现它的任何地方用类的名称调用这个方法。就像 Bool isEmptyStr = [MyClassName isStringEmpty:str] 但是,如果我们在类别下声明它会更好。因为不知何故,我们还需要利用类别。
    【解决方案2】:

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

    【讨论】:

    • 这是威尔·希普利的作品。仅供参考,您可以将 [thing isKindOfClass:[NSNull class]] 更改为 (thing == [NSNull null])
    • 唷....正是我想要的。我快疯了,试图弄清楚为什么我的“cellForRowAtIndexPath”函数由于空字符串而崩溃(我无法抓住问题)。这个函数完美解决了。
    • @Brane 评论的副本:如果您处于不知道要检查的对象类型的情况,我想这是可行的。但是我建议如果你不知道一个对象是 NSData 还是 NSArray,你就会遇到更大的问题。在这个电话之后你的下一个宏是什么,condenseToSingleNSData(id thing)expandToNSArray(id thing)?迟早,你会问你正在处理什么样的课程,最好在第一次参考时做。
    【解决方案3】:

    试试下面的

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

    【讨论】:

      【解决方案4】:

      你最好使用这个类别:

      @implementation NSString (Empty)
      
          - (BOOL) isWhitespace{
              return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);
          }
      
      @end
      

      【讨论】:

      • 该定义会得出结论,字符串“/r/n /r/n”是空的,但显然不是 - 它包含空格。你的函数真的是:-(BOOL)isWhitespace(NSString*);
      • 对此的推论。我实现了这个类别,并且有一个转折。如果你在一个 nil 字符串上调用它,这个函数永远不会被调用,你会得到一个 NO(或计算结果为 NO)作为返回值。然后你认为它不是空的......如果名称是 isFilled 或类似的东西,这可能会起作用。
      • 我想正确的类别应该是:@implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end 作为 Marc 和 Kyle 答案的组合。
      【解决方案5】:

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

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

      2) @" " // 包含空格

      从技术上讲,这两个字符串都是空的。我们可以通过使用 ONE Condition

      来写这两个东西
      if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
      {
          NSLog(@"Empty String");
      }
      else
      {
          NSLog(@"String contains some value");
      }
      

      【讨论】:

        【解决方案6】:

        只需检查您的字符串长度

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

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

        编码愉快...

        【讨论】:

        • 这个我用过很多次了。绝对不需要扩展、类别等等。
        【解决方案7】:
        //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;
        }
        

        【讨论】:

          【解决方案8】:

          斯威夫特版

          尽管这是一个 Objective C 问题,但我需要在 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.")
              }
          }
          

          普通的 Swift String 版本是

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

          另请参阅:Check empty string in Swift?

          【讨论】:

            【解决方案9】:

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

            方法一:

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

            方法二:

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

            【讨论】:

              【解决方案10】:

              最好的方法是使用类别。
              您可以检查以下功能。哪个条件都可以检查。

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

              【讨论】:

                【解决方案11】:
                if(str.length == 0 || [str isKindOfClass: [NSNull class]]){
                    NSLog(@"String is empty");
                }
                else{
                    NSLog(@"String is not empty");
                }    
                

                【讨论】:

                • 必须先进行空检查。如果str 为空,str.length 将抛出异常。
                【解决方案12】:
                if( [txtMobile.text length] == 0 )
                {
                    [Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
                }
                

                【讨论】:

                  【解决方案13】:
                  - (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;
                  }
                  

                  【讨论】:

                  • 前三个条件是多余的,你还没有包含stringByStrippingWhitespace的来源
                  【解决方案14】:

                  非常有用的帖子,添加了 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 评论的副本:如果您处于不知道要检查的对象类型的情况,我想这是可行的。但是我建议,如果你不知道一个对象是 NSData 还是 NSDictionary,你就会遇到更大的问题。在这个电话之后你的下一个宏是什么,condenseToSingleNSData(id thing)expandToNSArray(id thing)?迟早,你会问你正在处理什么样的课程,最好在第一次参考时做。
                  【解决方案15】:

                  您有两种方法可以检查字符串是否为空:

                  假设您的字符串名称是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
                  }
                  

                  选择以上方法,判断字符串是否为空。

                  【讨论】:

                    【解决方案16】:

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

                    【讨论】:

                      【解决方案17】:

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

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

                      【讨论】:

                        【解决方案18】:

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

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

                        【讨论】:

                          【解决方案19】:

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

                          【讨论】:

                          • 有一些非常罕见的 NSStrings 会导致误报(说字符串不是空的,但出于实际目的,它是空的)。考虑 @"\u200B"(仅由 Unicode 字符 ZERO WIDTH SPACE 组成。打印出来将打印 0 个字符(使用等宽字体验证),但 string.length 将给出 1。还有其他 Unicode 字符(如 OBJECT REPLACEMENT CHARACTER)的行为类似. 解析PDF文本时可能会得到后者。
                          • @fzwo 不是个屁,但理论上它不会给出假阴性。它的行为与您期望的一样完全。您对 ZERO WIDTH SPACE 的解释并不重要,因为 @"\u200B" is 仍然是一个字符,因此如果您测试字符串是否为空,它会说它不是因为有里面的一个人物。它只是无法按照 Unicode 标准打印。
                          • 当然这在技术上是正确的,我不争论。我只是想提醒一下,这可能不会表现出预期或预期的行为,这就是我写“出于实际目的”的原因。这取决于“空”的预期含义。
                          • 这不是假阴性。 “零值空间”是一个 unicode 字符,就像任何其他字符一样。如果与您的应用相关,它只是“值得记住”。 (好主意,fzwo!)
                          • 如果我错了请告诉我,但我认为您也可以省略 == 0 部分并在前面添加一个否定:![string length]。看起来更干净。
                          【解决方案20】:

                          你可以很容易地检查字符串是否为空:

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

                          【讨论】:

                            【解决方案21】:

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

                            假设空字符串意味着“一个不包含任何在当前上下文中重要的字符的字符串”。

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

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

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

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

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

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

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

                            【讨论】:

                              【解决方案22】:

                              检查这个:

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

                              或者

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

                              希望这会有所帮助。

                              【讨论】:

                                【解决方案23】:

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

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

                                【讨论】:

                                【解决方案24】:
                                if (string.length == 0) stringIsEmpty;
                                

                                【讨论】:

                                  【解决方案25】:

                                  它对我很有魅力

                                  如果NSStrings

                                  if ([s isKindOfClass:[NSNull class]] || s == nil || [s isEqualToString:@""]) {
                                  
                                      NSLog(@"s is empty");
                                  
                                  } else {
                                  
                                      NSLog(@"s containing %@", s);
                                  
                                  }
                                  

                                  【讨论】:

                                    【解决方案26】:

                                    马克的回答是正确的。但我会借此机会包含一个指向 Wil Shipley 的泛化 isEmpty 的指针,他在他的 blog 上分享了这个指针:

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

                                    【讨论】:

                                    • 如果你想让这个非常通用,可以将此逻辑实现为 NSObject 上的一个类别,而不是使用此处所示的静态方法。
                                    • 奇怪的是,这实际上并没有检查 [NSNull null]。
                                    • 如果您处于不知道要检查的对象类型的情况,我想这是可行的。但是我建议如果你不知道一个对象是 NSData 还是 NSArray,你就会遇到更大的问题。调用 condenseToSingleNSData(id thing) 之后,你的下一个宏是什么? expandToNSArray(id 事物)?迟早,你会问你正在处理什么样的课程,最好在第一次参考时做。
                                    • @BradSmith,可以为它创建一个类别,但不会计算 nil 值,因为不会调用该方法。例如,如果 thing = nil,则不会调用 [thing IsEmpty] 并且总是返回 false/NO。要检查 nil,需要有一个参数。 Nil 对象不能通过类别将自己与 nil 进行比较。
                                    • @chris 然后你可以把分类方法改成-isNotEmpty :)
                                    【解决方案27】:

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

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

                                    [stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
                                    

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

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

                                    现在你可以使用了:

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

                                    【讨论】:

                                    • 为什么在不需要的时候使用宏?在这种情况下,任何排序类型的安全都被牺牲了,没有真正的好处。
                                    • 是为了简单方便,如果你喜欢写“[object stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]”每次你想检查一个字符串是否为空,由你决定。
                                    • 请注意,Apple 的 whitespaceCharacterSet 不包含换行符!这是我写的一个类别,包括trim和其他一些有用的方法:github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.mgithub.com/alexch/unsuck/blob/master/unsuckTests/…
                                    • @E.M.我不是宏的粉丝,但我不明白你的类型安全问题。在编译期间,宏被其内容替换,因此如果您使用不同于 NSString 的内容调用宏,您仍然会从编译器收到消息。无论如何,类别会好得多。
                                    【解决方案28】:

                                    在任何情况下,最好的方法是检查给定字符串的长度。为此,如果您的字符串是 myString 那么代码是:

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

                                    【讨论】:

                                      【解决方案29】:

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

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

                                      【讨论】:

                                        【解决方案30】:

                                        我把这个:

                                        @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) nil case 本身由 'isNotEmpty' Thx 处理!
                                        • 好主意,可惜-(BOOL)isEmpty{ return ![self isNotEmpty]} 不适用于类别。
                                        • @Brane 评论的副本:如果您处于不知道要检查的对象类型的情况,我想这是可行的。但是我建议如果你不知道一个对象是 NSData 还是 NSArray,你就会遇到更大的问题。在这个电话之后,你的下一个宏是什么,condenseToSingleNSData(id thing)expandToNSArray(id thing)?迟早,你会问你正在处理什么样的课程,最好在第一次参考时做。
                                        猜你喜欢
                                        • 2018-08-10
                                        • 2018-06-24
                                        • 2010-12-17
                                        • 1970-01-01
                                        • 2012-04-05
                                        • 1970-01-01
                                        • 2013-08-05
                                        • 1970-01-01
                                        • 2012-04-03
                                        相关资源
                                        最近更新 更多