【发布时间】:2010-10-28 07:19:34
【问题描述】:
如何在 Objective-C 中测试 NSString 是否为空?
【问题讨论】:
标签: ios objective-c nsstring
如何在 Objective-C 中测试 NSString 是否为空?
【问题讨论】:
标签: ios objective-c nsstring
可能这个答案是已经给出的答案的副本,但我在检查条件的顺序上做了很少的修改和更改。请参考以下代码:
+(BOOL)isStringEmpty:(NSString *)str {
if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
return YES;
}
return NO;
}
【讨论】:
我见过的最好的解决方案之一(比 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);
}
【讨论】:
condenseToSingleNSData(id thing)? expandToNSArray(id thing)?迟早,你会问你正在处理什么样的课程,最好在第一次参考时做。
试试下面的
NSString *stringToCheck = @"";
if ([stringToCheck isEqualToString:@""])
{
NSLog(@"String Empty");
}
else
{
NSLog(@"String Not Empty");
}
【讨论】:
你最好使用这个类别:
@implementation NSString (Empty)
- (BOOL) isWhitespace{
return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]length] == 0);
}
@end
【讨论】:
@implementation NSString (Empty) - (BOOL) empty{ return ([[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length] == 0); } @end 作为 Marc 和 Kyle 答案的组合。
您可以通过两种方式获得一个空字符串:
1) @"" // 不包含空格
2) @" " // 包含空格
从技术上讲,这两个字符串都是空的。我们可以通过使用 ONE Condition
来写这两个东西if ([firstNameTF.text stringByReplacingOccurrencesOfString:@" " withString:@""].length==0)
{
NSLog(@"Empty String");
}
else
{
NSLog(@"String contains some value");
}
【讨论】:
只需检查您的字符串长度
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;
}
【讨论】:
尽管这是一个 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.")
}
【讨论】:
只需使用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
}
【讨论】:
最好的方法是使用类别。
您可以检查以下功能。哪个条件都可以检查。
-(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(str.length == 0 || [str isKindOfClass: [NSNull class]]){
NSLog(@"String is empty");
}
else{
NSLog(@"String is not empty");
}
【讨论】:
str 为空,str.length 将抛出异常。
if( [txtMobile.text length] == 0 )
{
[Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
【讨论】:
- (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的来源
非常有用的帖子,添加了 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);
}
【讨论】:
condenseToSingleNSData(id thing)? expandToNSArray(id thing)?迟早,你会问你正在处理什么样的课程,最好在第一次参考时做。
您有两种方法可以检查字符串是否为空:
假设您的字符串名称是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:@""]) 一样简单
【讨论】:
我使用以下代码检查了一个空字符串:
//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"];
}
【讨论】:
您可以使用此方法检查您的字符串是否为空:
+(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 并添加此方法,这样您就可以通过在您的应用程序中调用它来使用此方法。
【讨论】:
你可以检查[string length] == 0。这将检查它是否是一个有效但为空的字符串 (@"") 以及它是否为 nil,因为在 nil 上调用 length 也会返回 0。
【讨论】:
@"\u200B"(仅由 Unicode 字符 ZERO WIDTH SPACE 组成。打印出来将打印 0 个字符(使用等宽字体验证),但 string.length 将给出 1。还有其他 Unicode 字符(如 OBJECT REPLACEMENT CHARACTER)的行为类似. 解析PDF文本时可能会得到后者。
ZERO WIDTH SPACE 的解释并不重要,因为 @"\u200B" is 仍然是一个字符,因此如果您测试字符串是否为空,它会说它不是因为有里面的一个人物。它只是无法按照 Unicode 标准打印。
![string length]。看起来更干净。
你可以很容易地检查字符串是否为空:
if ([yourstring isEqualToString:@""]) {
// execute your action here if string is empty
}
【讨论】:
因此,除了检查字符串长度是否小于 1 的基本概念之外,深入考虑上下文也很重要。 人类或计算机或其他语言可能对空字符串有不同的定义,并且在这些相同的语言中,额外的上下文可能会进一步改变含义。
假设空字符串意味着“一个不包含任何在当前上下文中重要的字符的字符串”。
这可能意味着视觉上,因为颜色和背景颜色在属性字符串中是相同的。有效地为空。
这可能意味着没有有意义的字符。所有点或所有破折号或所有下划线都可能被视为空。 此外,没有有意义的重要字符可能意味着字符串没有读者理解的字符。 它们可以是被定义为对读者无意义的语言或字符集中的字符。我们可以稍微不同地定义它,说字符串不构成给定语言中的已知单词。
我们可以说空是所渲染字形中负空间百分比的函数。
即使是没有一般视觉表示的不可打印字符序列也不是真正的空。控制角色浮现在脑海。尤其是低 ASCII 范围(我很惊讶没有人提到这些,因为它们管理大量系统并且不是空白,因为它们通常没有字形和视觉指标)。然而字符串长度不为零。
结论。 仅长度并不是这里唯一的衡量标准。 上下文集成员资格也非常重要。
字符集成员资格是一个非常重要的常见附加度量。 有意义的序列也是一种相当常见的序列。 (想想 SETI 或加密或验证码) 还存在其他更抽象的上下文集。
因此,在假设字符串仅基于长度或空格为空之前,请仔细考虑。
【讨论】:
检查这个:
if ([yourString isEqualToString:@""])
{
NsLog(@"Blank String");
}
或者
if ([yourString length] == 0)
{
NsLog(@"Blank String");
}
希望这会有所帮助。
【讨论】:
只需将您的字符串传递给以下方法:
+(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 (string.length == 0) stringIsEmpty;
【讨论】:
它对我很有魅力
如果NSString 是s
if ([s isKindOfClass:[NSNull class]] || s == nil || [s isEqualToString:@""]) {
NSLog(@"s is empty");
} else {
NSLog(@"s containing %@", s);
}
【讨论】:
马克的回答是正确的。但我会借此机会包含一个指向 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);
}
【讨论】:
-isNotEmpty :)
第一种方法是有效的,但如果您的字符串有空格 (@" ") 则不起作用。所以你必须在测试之前清除这些空白。
这段代码清除了字符串两边的所有空格:
[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
一个好主意是创建一个宏,这样你就不必输入这个怪物行了:
#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]
现在你可以使用了:
NSString *emptyString = @" ";
if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
【讨论】:
whitespaceCharacterSet 不包含换行符!这是我写的一个类别,包括trim和其他一些有用的方法:github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.mgithub.com/alexch/unsuck/blob/master/unsuckTests/…
在任何情况下,最好的方法是检查给定字符串的长度。为此,如果您的字符串是 myString 那么代码是:
int len = [myString length];
if(len == 0){
NSLog(@"String is empty");
}
else{
NSLog(@"String is : %@", myString);
}
【讨论】:
另一种选择是检查它是否等于@"" 和isEqualToString:,如下所示:
if ([myString isEqualToString:@""]) {
NSLog(@"myString IS empty!");
} else {
NSLog(@"myString IS NOT empty, it is: %@", myString);
}
【讨论】:
我把这个:
@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,这是我们想要的。
【讨论】:
-(BOOL)isEmpty{ return ![self isNotEmpty]} 不适用于类别。
condenseToSingleNSData(id thing)? expandToNSArray(id thing)?迟早,你会问你正在处理什么样的课程,最好在第一次参考时做。