在Objective-C中检查空string的正确方法是什么?
我在我的iPhone应用程序中使用这个
if (title == nil) { // do something }
但是会引发一些exception,控制台显示标题是“(null)”。
所以我现在使用这个:
if (title == nil || [title isKindOfClass:[NSNull class]]) { //do something }
有什么区别,什么是确定一个string是否为空的最好方法?
正如其他人指出的那样,Cocoa / Objective C下有很多种“null”。但是还有一点需要注意的是[Title是KindOfClass:[NSNull class]]是毫无意义的复杂,因为[NSNull null]被logging为单身人士,所以你可以检查指针相等。 查看cocoa的主题:使用空值 。
所以一个好的testing可能是:
if (title == (id)[NSNull null] || title.length == 0 ) title = @"Something";
请注意,即使标题为零,title.length也将返回0 / nil / false,即在这种情况下为0,因此您不必特殊情况。 这是Objective-C的新手遇到麻烦,尤其是来自其他语言的消息/方法调用无法崩溃的情况。
它就像一样简单
if([object length] >0) { // do something }
请记住,在目标C中,如果object为null,则返回0作为值。
这会得到一个空string和长度为0的string。
请参阅本网站上的以下相关文章:
- 在Objective-C中if(variables)与if(variables!= nil)相同
我认为你的错误与其他事情有关,因为你不需要做额外的检查。
也看到这个相关的问题: 正确检查无sqlite文本列
我发现,为了真正做到这一点,你最终不得不做类似的事情
if ( ( ![myString isEqual:[NSNull null]] ) && ( [myString length] != 0 ) ) { }
否则,你会得到奇怪的情况,控制仍然会绕过你的支票。 我没有遇到一个通过isEqual
和长度检查。
所有这些“为我工作的答案”是什么? 我们都用相同的语言编码,规则是
- 确保参考不是零
- 检查并确保string的长度不为0
这是什么将为所有人工作。 如果一个给定的解决scheme只“为你工作”,它的唯一原因是你的应用程序stream程将不允许引用可能为null或string长度为0的情况。正确的方法是处理你想在所有情况下。
如果你想testing所有零/空对象(比如空string或空数组/集合),可以使用下面的代码:
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); }
有两种情况:
对象可能是[NSNull null]
,或者是不可能的。
你的应用程序通常不应该使用[NSNull null];
如果你想把一个“ null ”对象放到一个数组中,或者把它用作字典值,你只能使用它。 然后你应该知道哪些数组或字典可能包含空值,哪些可能不包含空值。
如果您认为数组永远不会包含[NSNull null]
值,则不要检查它。 如果有一个[NSNull null]
,你可能会得到一个exception,但这很好:Objective-Cexception表示编程错误。 而且你有一个编程错误,需要通过修改一些代码来修复。
如果一个对象可能是[NSNull null]
,那么通过testing就可以很简单地检查这个对象
(object == [NSNull null])
。 调用isEqual
或检查对象的类是无稽之谈。 只有一个[NSNull null]
对象,普通的旧C运算符以最直接和最有效的方式检查它。
如果你检查一个不能是[NSNull null]
的NSString
对象(因为你知道它不能是[NSNull null]
或者你只是检查它与[NSNull null]
不同[NSNull null]
,那么你需要问自己想怎么处理一个空string,即一个长度为0的string。如果将它视为一个null
string,如nil
,则testing(object.length == 0)
。如果object == nil
,则object.length将返回0,所以此testing涵盖零对象和长度为0的string。如果你把一个长度为0的string作为不同于零的string,只要检查object == nil
。
最后,如果你想添加一个string到一个数组或字典,并且string可以是零,你可以select不添加它,用@""
replace它,或者用[NSNull null]
replace它。 用@""
replace它意味着你不能区分“无string”和“长度为0的string”。 用[NSNull null]
replace它意味着当你访问检查[NSNull null]
对象的数组或字典时,你必须编写代码。
你只是检查零
if(data[@"Bonds"]==nil){ NSLog(@"it is nil"); }
要么
if ([data[@"Bonds"] isKindOfClass:[NSNull class]]) { NSLog(@"it is null"); }
if(textfield.text.length == 0){ //do your desired work }
试试这个检查null
if (text == nil)
@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
。
如果这种事情不存在,你可以创build一个NSString类别:
@interface NSString (TrucBiduleChoseAdditions) - (BOOL)isEmpty; @end @implementation NSString (TrucBiduleChoseAdditions) - (BOOL)isEmpty { return self == nil || [@"" isEqualToString:self]; } @end
什么对我来说是if ( !myobject )
完整的空string检查可以如下所示:<\ br>
如果(MyString的) { if([mystring isEqualToString:@“”]) { mystring = @“一些string”; } } 其他 { //语句 }
我只检查空string
if([myString isEqual:[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 }