如何检测字符串在Obj-C里是否为空?

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术。本文将为读者讲解如何检测字符串在Objective-C里是否为空。

问题:

Jamey McElveen

如何检测NSString在Objective-C里是否为空?

答案:

Marc Charbonneau

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

Matt G

楼上的回答是正确的。但是我想借此机会介绍一下Wil Shipley总结的isEmpty,他分享在blog上的:


1

2

3

4

5

6

7

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

}

第一种方法是有效地,但是如果字符串有空格(@" ")的话就买不起作用了。所以必须在测试前清除空格。

下面的代码能够清除字符串两边的所有空格


1

[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];

有个不错的方法是定义一个宏,这样你就不用输入这一长串代码了:


1

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

现在你可以使用:


1

2

NSString *emptyString = @"   ";

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

Rob

我见过的最好的解决方法之一(比Matt G的更好)这种改进的内联函数,我在Git Hub报告里找到的:


1

2

3

4

5

6

7

8

9

// Check if the "thing" pass‘d 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);

}

user238824

你最好使用这个函数:


1

2

3

4

5

6

7

@implementation NSString (Empty)

    - (BOOL) empty{

        return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);

    }

@end

chown

另一个选择是使用isEqualToString检查是否等于@"",就像这样:


1

2

3

4

5

if ([myString isEqualToString:@""]) {

    NSLog(@"myString IS empty!");

} else {

    NSLog(@"myString IS NOT empty, it is: %@", myString);

}

Jim Thio

我用的这个:


1

2

3

4

5

6

7

8

9

10

11

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无值, 这个功能就永远不会被调用。它将返回false,这是所需的。

Samir Jwarchan

使用下面的if else条件之一就可以:

方法1:


1

2

3

4

5

6

<strong>if([yourString isEqualToString:@""]){

        // yourString is empty.

    }

    else {

        // yourString has some text on it.

    } </strong>

方法 2:


1

2

3

4

5

6

if([yourString length] == 0){

    // Empty yourString

}

else {

    // yourString is not empty

}

原文链接:stackoverflow

文章选自StackOverFlow社区,鉴于其内容对于开发者有所帮助,现将文章翻译于此,供大家参考及学习。9Tech将每日持续更新,读者可点击StackOverflow(简称:SOF)精选问答汇总,查看全部译文内容。同时,我们也招募志同道合的技术朋友共同翻译,造福大家!报名请发邮件至zhangqi_wj#cyou-inc.com。(#换成@)

时间: 2024-08-28 21:35:54

如何检测字符串在Obj-C里是否为空?的相关文章

检测字符串中是否含有非法字符js代码

检测字符串中是否含有非法字符js代码:通常情况下,网站输入的字符串内容是需要经过检测的,因为有些字符带有一定的危险性,会对站点带来一定的危害,下面就介绍一下如何检测一个字符串是否含有非法字符,代码如下: function checks(str){ szMsg="[#_%&'\",;:=!^]"; alertStr=""; for(i=1;i<szMsg.length+1;i++){ if(str.indexOf(szMsg.substring

C#正则表达式基础 [0-9]$ 检测字符串是否以数字结尾

1 代码 1 //[0-9]$ 检测字符串是否以数字结尾 2 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Net; 7 using System.Text; 8 using System.Text.RegularExpressions; 9 using System.Threading.Tasks; 10 11 namespace ConsoleApplicatio

C#正则表达式基础 ^[0-9] 检测字符串的首个字符是否是数字

1 代码 1 //^[0-9] 检测字符串的首个字符是否是数字 2 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Net; 7 using System.Text; 8 using System.Text.RegularExpressions; 9 using System.Threading.Tasks; 10 11 namespace ConsoleApplica

C#正则表达式基础 [0-9][0-9] 检测字符串是否存在两个相邻的数字

1 代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net; 5 using System.Text; 6 using System.Text.RegularExpressions; 7 using System.Threading.Tasks; 8 9 namespace ConsoleApplication7 10 { 11 class Program 12

C#正则表达式基础 检测字符串是否存在两个相邻的字母 ([a-z]|[A-Z])([a-z]|[A-Z])

1 代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net; 5 using System.Text; 6 using System.Text.RegularExpressions; 7 using System.Threading.Tasks; 8 9 namespace ConsoleApplication7 10 { 11 class Program 12

Word Break II 求把字符串拆分为字典里的单词的所有方案 @LeetCode

这道题类似  Word Break 判断是否能把字符串拆分为字典里的单词 @LeetCode 只不过要求计算的并不仅仅是是否能拆分,而是要求出所有的拆分方案.因此用递归. 但是直接递归做会超时,原因是LeetCode里有几个很长但是无法拆分的情况,所以就先跑一遍Word Break,先判断能否拆分,然后再进行拆分. 递归思路就是,逐一尝试字典里的每一个单词,看看哪一个单词和S的开头部分匹配,如果匹配则递归处理S的除了开头部分,直到S为空,说明可以匹配. public class Solution

Oracle 把秒转成时分秒格式(hh24:mm:ss);检测字符串是否是数字

不说废话,贴代码: 1 CREATE OR REPLACE FUNCTION to_time(sec IN NUMBER) RETURN VARCHAR2 IS 2 /*把秒转成时分秒格式 3 auth lzpong 201/09/16 4 */ 5 BEGIN 6 RETURN TRUNC(NVL(sec,0)/3600)||':'||SUBSTR(NUMTODSINTERVAL(NVL(sec,0), 'second'),15,5); 7 EXCEPTION WHEN OTHERS THEN

Word Break II 求把字符串拆分为字典里的单词的全部方案 @LeetCode

这道题相似  Word Break 推断能否把字符串拆分为字典里的单词 @LeetCode 只不过要求计算的并不不过能否拆分,而是要求出全部的拆分方案. 因此用递归. 可是直接递归做会超时,原因是LeetCode里有几个非常长可是无法拆分的情况.所以就先跑一遍Word Break,先推断能否拆分.然后再进行拆分. 递归思路就是,逐一尝试字典里的每个单词,看看哪一个单词和S的开头部分匹配,假设匹配则递归处理S的除了开头部分,直到S为空.说明能够匹配. Given a string s and a

9.11排序与查找(五)——有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置

/** * 功能:有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置. */ /** * 思路:对二分查找法做修改,与mid比较的地方,如果mid为空字符串,则将mid换到离它最近的非空字符串的位置. * @param strings * @param str * @return */ public static int search(String[] strings,String str){ if(strings==null||str==null||str=="")