0

我正在创建一个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:数组 - 发送到方法的参数

我预计isEmpty对于 nil 或空数组返回 TRUE,但对于nil数组返回 FALSE。

我的问题不是为什么,因为我知道为什么。我的问题是:即使对于 nil 对象,是否有可能让我isEmpty返回 TRUE?

4

4 回答 4

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.
}
于 2013-07-28T17:12:23.480 回答
1

其他回答者已经正确指出要nil返回 0 的消息;如果该方法应该返回 a BOOL,则该 0 被解释为NO

我建议更改方法的语义以利用这一事实:

- (BOOL)U262IsNotEmpty
{
    return ([self count) > 0);
}

不要忘记,您应该始终为添加到框架类的方法添加前缀

于 2013-07-28T19:34:18.643 回答
0

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

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

于 2013-07-28T17:03:27.547 回答
-1

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

要修复它,请使用代码:

if (!array || array.isEmpty)
  continue;
于 2013-07-28T17:07:02.653 回答