NSArray是空的

时间:2013-07-28 16:56:05

标签: objective-c categories is-empty

我正在创建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?

4 个答案:

答案 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)

如果您的arraynil,则实际上未发送任何消息,因此您无法编写处理该方法的方法。

如果您将代码结构化为将数组传递给的函数,那么您可以处理参数nil

答案 3 :(得分:-1)

每个在nil上调用的方法都返回nil。 nil的布尔值为false,这就是你的if不起作用的原因。

要修复它,请使用代码:

if (!array || array.isEmpty)
  continue;