Answers:
您可以检查是否[string length] == 0
。这将检查它是否是有效但为空的字符串(@“”)以及是否为nil,因为调用length
nil也会返回0。
ZERO WIDTH SPACE
并不重要,因为@"\u200B"
它仍然是一个字符,因此,如果您测试字符串是否为空,则说明不是因为其中包含一个字符。遵循Unicode标准只是无法打印。
![string length]
。似乎更干净。
马克的答案是正确的。但是,我将借此机会包括指向威尔·希普利(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);
}
-isNotEmpty
:)
第一种方法有效,但是如果您的字符串有空格(@" "
),则无效。因此,您必须在测试之前清除此空白。
这段代码清除了字符串两侧的所有空格:
[stringObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ];
一个好主意是创建一个宏,因此您不必键入以下怪物行:
#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]
现在您可以使用:
NSString *emptyString = @" ";
if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");
NSString
类别来提供服务,该类别添加一个名为的方法trimmedString
,该方法完全可以完成您编写的内容。
whitespaceCharacterSet
不包含换行符!这里有一个类我写,包括trim
和其他一些有用的方法:github.com/alexch/unsuck/blob/master/unsuck/NSString%2BUnsuck.m github.com/alexch/unsuck/blob/master/unsuckTests/...
我见过的最好的解决方案之一(比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)
您最好使用以下类别:
@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
作为马克和凯尔的答案的结合。
我把这个:
@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)
只需将您的字符串传递给以下方法:
+(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
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
}
即使这是一个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中检查空字符串?
可能这个答案是已经给出的答案的重复,但是我没有按照检查条件的顺序进行任何修改和更改。请参考以下代码:
+(BOOL)isStringEmpty:(NSString *)str
{
if(str == nil || [str isKindOfClass:[NSNull class]] || str.length==0) {
return YES;
}
return NO;
}
您可以使用以下方法检查您的字符串是否为空:
+(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并添加此方法,以便您可以通过在整个应用程序中对其进行调用来使用此方法。
只需检查您的字符串长度
if (!yourString.length)
{
//your code
}
发送给NIL的消息将返回nil或0,因此无需测试nil :)。
快乐的编码...
因此,除了检查字符串长度小于1的基本概念外,深入考虑上下文非常重要。人类或计算机等语言可能对空字符串有不同的定义,并且在这些相同的语言内,其他上下文可能会进一步更改含义。
假设空字符串表示“在当前上下文中不包含任何重要字符的字符串”。
这可能是视觉上的意思,因为属性字符串中的颜色和背景颜色相同。有效地为空。
这可能意味着没有意义的字符。所有的点或所有的破折号或所有下划线可能被认为是空的。此外,如果没有有意义的有效字符,则可能意味着字符串没有读者理解的字符。它们可以是语言或characterSet中定义为对读者无意义的字符。我们可以用不同的方式定义它,以说该字符串在给定的语言中没有已知的单词。
我们可以说空是渲染字形中负空间百分比的函数。
甚至没有一般视觉表示的一系列不可打印字符也不是真正的空。想到控制字符。尤其是低ASCII范围(我很惊讶没有人提到它们,因为它们占用了很多系统并且没有空格,因为它们通常没有字形和视觉指标)。但是字符串长度不为零。
结论。长度不是这里唯一的度量。上下文集合成员身份也很重要。
字符集成员资格是非常重要的常见附加措施。有意义的序列也是相当普遍的序列。(认为SETI或crypto或captchas)还存在其他更抽象的上下文集。
因此,在基于长度或空格假设字符串为空之前,请仔细考虑。
非常有用的帖子,添加了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)
- (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
最好的方法是使用类别。
您可以检查以下功能。其中具有所有要检查的条件。
-(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;
}
我已经使用以下代码检查了一个空字符串:
//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"];
}
它就像if([myString isEqual:@""])
或一样简单if([myString isEqualToString:@""])
//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");
}
if( [txtMobile.text length] == 0 )
{
[Utility showAlertWithTitleAndMessage: AMLocalizedString(@"Invalid Mobile No",nil) message: AMLocalizedString(@"Enter valid Mobile Number",nil)];
}
@"\u200B"
(仅由Unicode字符ZERO WIDTH SPACE组成。将其打印出来将打印0个字符(使用等宽字体验证),但是string.length将给出1。还有其他Unicode字符(例如OBJECT REPLACEMENT CHARACTER)也具有相同的行为。获得后者在解析时PDF文本。