【问题标题】:NSArray isEmptyNSArray isEmpty
【发布时间】:2013-07-28 16:56:04
【问题描述】:

我正在创建一个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。

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

【问题讨论】:

  • 作为一个小优化,您可以只使用return (self.count == 0) -- == 比较返回一个类似布尔值的值。

标签: objective-c categories is-empty


【解决方案1】:

正如@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.
}

【讨论】:

    【解决方案2】:

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

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

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

    别忘了you should always put prefixes on methods you add to framework classes

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        要修复它,请使用代码:

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

        【讨论】:

          猜你喜欢
          • 2015-06-30
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          相关资源
          最近更新 更多