在 Objective-C 中检查空字符串的正确方法是什么?

我在我的 iPhone 应用程序里用到了这个

if (title == nil) {
// do something
}

但是它抛出了一些异常,控制台显示标题为“(null)”。

所以我现在用这个:

if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}

区别是什么? 确定一个字符串是否为空的最佳方法是什么?

189652 次浏览

如果这种东西还不存在,那么可以创建一个 NSString 类别:

@interface NSString (TrucBiduleChoseAdditions)


- (BOOL)isEmpty;


@end


@implementation NSString (TrucBiduleChoseAdditions)


- (BOOL)isEmpty {
return self == nil || [@"" isEqualToString:self];
}


@end

请参阅本网站下列相关文章:

我认为你的错误与其他事情有关,因为你不应该做额外的检查。

也请看这个相关的问题: 正确检查 nil sqlite 文本列

如果您想测试所有的 nil/空对象(比如空字符串或空数组/集) ,您可以使用以下方法:

static inline BOOL IsEmpty(id object) {
return object == nil
|| ([object respondsToSelector:@selector(length)]
&& [(NSData *) object length] == 0)
|| ([object respondsToSelector:@selector(count)]
&& [(NSArray *) object count] == 0);
}

就像

if([object length] >0)
{
// do something
}

请记住,在目标 C 中,如果 object 为 null,则返回0作为值。

这将得到一个空字符串和一个0长度的字符串。

正如其他人指出的,在 Cocoa/Objective C 下有许多种“ null”。但还有一点需要注意的是,[ title isKindOfClass: [ NSNull class ]]是无意义的复杂,因为[ NSNull null ]被记录为单例,所以您可以检查指针相等性。参见 Cocoa 的主题: 使用 Null

因此,一个好的测试方法可能是:

if (title == (id)[NSNull null] || title.length == 0 ) title = @"Something";

注意,即使 title 为 nil,title.length 也会返回0/nil/false,在本例中为0,所以不需要特殊大小写它。这是那些初次接触 Objective C 的人很难适应的,特别是来自其他语言的消息/方法调用为 nil 崩溃时。

对我有效的是 if ( !myobject )

这些“适合我的答案”是怎么回事? 我们都用同一种语言编写代码,规则是

  1. 确保引用不是 没有
  2. 检查并确保字符串的长度不为0

这对所有人都有好处。如果一个给定的解决方案只“适合你”,这仅仅是因为你的应用程序流不允许引用为空或字符串长度为0的场景。这样做的正确方法是使用在所有情况下都能处理所需内容的方法。

if(textfield.text.length == 0){
//do your desired work
}

我发现,为了真正做好它,你最终不得不做一些类似的事情

if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) {
}

否则你会遇到奇怪的情况,控制仍然会绕过你的检查。我还没遇到过能通过 isEqual和长度检查的。

有两种情况:

一个对象可能是 [NSNull null],也可能是不可能的。
您的应用程序通常不应该使用 [NSNull null];,只有当您想将“ 无效”对象放入数组或将其用作字典值时才使用它。然后,您应该知道哪些数组或字典可能包含空值,哪些可能不包含空值。
如果您认为数组从来不包含 [NSNull null]值,那么就不要检查它。如果有一个 [NSNull null],您可能会得到一个异常,但这没有关系: Objective-C 异常表示编程错误。你有一个编程错误,需要修改一些代码。

如果一个对象 可以[NSNull null],那么您可以通过测试简单地检查这一点
(object == [NSNull null]).调用 isEqual或检查对象的类是无意义的。只有一个 [NSNull null]对象,普通的 C 操作符用最简单和最有效的方式检查它。

如果你检查一个不能是 [NSNull null]NSString对象(因为你知道它不能是 [NSNull null],或者因为你刚刚检查了它是不同于 [NSNull null]的,那么你需要问你自己如何处理一个空字符串,即长度为0的字符串。如果你处理它是一个 null字符串像 nil,然后测试 (object.length == 0)。Length 将返回0,如果是 object == nil,那么这个测试将覆盖长度为0的 nil 对象和字符串。如果长度为0的字符串与 nil 字符串不同,只需检查 object == nil

最后,如果您想向数组或字典中添加一个字符串,并且该字符串可以为 nil,那么您可以选择不添加它,或者用 @""替换它,或者用 [NSNull null]替换它。将其替换为 @""意味着您将失去区分“无字符串”和“长度为0的字符串”的能力。将其替换为 [NSNull null]意味着在访问检查 [NSNull null]对象的数组或字典时必须编写代码。

尝试检查空

 if (text == nil)

完全检查字符串是否为空的条件可以如下所示: < br >

if(mystring)
{
if([mystring isEqualToString:@""])
{
mystring=@"some string";
}
}
else
{
//statements
}

你只需要检查一下是否为零

if(data[@"Bonds"]==nil){
NSLog(@"it is nil");
}

或者

if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) {
NSLog(@"it is null");
}
@interface NSString (StringFunctions)
- (BOOL) hasCharacters;
@end


@implementation NSString (StringFunctions)
- (BOOL) hasCharacters {
if(self == (id)[NSNull null]) {
return NO;
}else {
if([self length] == 0) {
return NO;
}
}
return YES;
}
@end


NSString *strOne = nil;
if([strOne hasCharacters]) {
NSLog(@"%@",strOne);
}else {
NSLog(@"String is Empty");
}

这将工作与以下情况,或 NSString *strOne = @""NSString *strOne = @"StackOverflow"NSString *strOne = [NSNull null]NSString *strOne

我只检查空字符串

如果([ myString isequals: [ NSNull null ]])

if ([linkedStr isEqual:(id)[NSNull null]])
{
_linkedinLbl.text=@"No";
}else{
_linkedinLbl.text=@"Yes";
}
if ([strpass isEqual:[NSNull null]] || strpass==nil || [strpass isEqualToString:@"<null>"] || [strpass isEqualToString:@"(null)"] || strpass.length==0 || [strpass isEqualToString:@""])
{
//string is blank
}

宏观解决方案(2020)

下面是我用于安全字符串而不是在 UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILabel = UILab上获取“ (无)”字符串的宏,例如:

#define SafeString(STRING) ([STRING length] == 0 ? @"" : STRING)

假设您有一个成员类和 name 属性,并且 name 为 nil:

NSLog(@"%@", member.name); // prints (null) on UILabel

宏观:

NSLog(@"%@", SafeString(member.name)); // prints empty string on UILabel

干净利落

扩展解决方案(2020)

如果您更喜欢在项目中选择 nil Null 和空字符串,可以使用我的扩展行如下:

NSString + Extension.h

///
/// Checks if giving String is an empty string or a nil object or a Null.
/// @param string string value to check.
///
+ (BOOL)isNullOrEmpty:(NSString*)string;

NSString + Extension.m

+ (BOOL)isNullOrEmpty:(NSString*)string {
if (string) { // is not Nil
NSRange range = [string rangeOfString:string];
BOOL isEmpty = (range.length <= 0 || [string isEqualToString:@" "]);
BOOL isNull = string == (id)[NSNull null];


return (isNull || isEmpty);
}


return YES;
}

示例用法

if (![NSString isNullOrEmpty:someTitle]) {
// You can safely use on a Label or even add in an Array for example. Remember: Arrays don't like the nil values!
}

字符串:

+ (BOOL) checkStringIsNotEmpty:(NSString*)string {
if (string == nil || string.length == 0) return NO;
return YES;

}

请参考下面的图片:

enter image description here

字符串:

+ (BOOL) checkStringIsNotEmpty:(NSString*)string {
if (string == nil || string.length == 0) return NO;
return YES;}