我正在创建NSArray
类别,如下所示:
//
// NSArray+Empty.h
//
#import <Foundation/Foundation.h>
@interface NSArray (Empty)
/**
* Convenient method to check if the array is empty or not.
*/
@property (nonatomic, readonly) BOOL isEmpty;
@end
和
//
// NSArray+Empty.m
//
#import "NSArray+Empty.h"
@implementation NSArray (Empty)
- (BOOL)isEmpty {
return (self.count == 0) ? YES : NO;
}
@end
然后,将此类别与“nil
”对象一起使用,如:
if (array.isEmpty)
return;
WHERE:array - 参数发送到方法
我预计isEmpty
对于nil或空数组返回TRUE,但对nil
数组返回FALSE。
我的问题不是为什么,因为我知道为什么。我的问题是:即使是nil对象,我的isEmpty
是否可以返回TRUE?
答案 0 :(得分:3)
正如@Wain和@Michal都指出的那样,到nil
的消息总是返回nil
或者为零,因此无法获得您尝试使用方法实现的行为。相反,你可以写一个C函数:
// Assuming your project uses a prefix such as XYZ...
BOOL XYZIsEmptyArrayOrNil(NSArray *array)
{
return array == nil || [array count] == 0;
}
然后这样称呼它......
if (XYZIsEmptyArrayOrNil(myArray)) {
// Do whatever.
}
答案 1 :(得分:1)
其他回答者已经正确地指出,nil
的消息会返回0;如果该方法应该返回BOOL
,则该0被解释为NO
。
我建议更改方法的语义以利用这个事实:
- (BOOL)U262IsNotEmpty
{
return ([self count) > 0);
}
不要忘记you should always put prefixes on methods you add to framework classes。
答案 2 :(得分:0)
如果您的array
为nil
,则实际上未发送任何消息,因此您无法编写处理该方法的方法。
如果您将代码结构化为将数组传递给的函数,那么您可以处理参数nil
。
答案 3 :(得分:-1)
每个在nil上调用的方法都返回nil。 nil的布尔值为false,这就是你的if不起作用的原因。
要修复它,请使用代码:
if (!array || array.isEmpty)
continue;