为NSUInteger返回NSNotFound是否可取?

时间:2012-11-09 06:41:50

标签: objective-c ios

我正在研究NSArray的类别,我实现的其中一个函数旨在返回数组中的字符串数(或非数字)。这一切都很好,但我的问题是在输入数组的计数为零的情况下使用NSNotFound作为返回。

Apple的文档声明:

  

NSNotFound通常由各种方法和功能使用   搜索串行数据中的项目并返回索引,例如字符   在字符串对象中或NSArray对象中的ID。

如果我将indexOfObject:用于不在数组中的项目,这就完全有道理了。但是,在下面演示的上下文中正在使用NSNotFound正确用法?当然,我可以返回零并将其称为一天,但看到2147483647并立即知道问题出在哪里会很有帮助。

- (NSUInteger)countOfStringsInArray {
    NSUInteger currentCount = 0;
    if ([self count] > 0) {
        for (id obj in self) {
            if (![obj integerValue]) {
                currentCount ++;
            }
        }
        return currentCount;
    }
    return NSNotFound;
}

4 个答案:

答案 0 :(得分:5)

不,不是在这种情况下。示例中的方法返回 count 。您会考虑在返回索引的方法上使用/返回NSNotFound(例如),其中0 也是有效索引,因此虚假陈述的结果。

所以“是的,你应该只返回0并且返回类型应该是无符号的(NSUInteger)”,因为NSNotFound应该与计数相关联。这真的涵盖了你的案例,而不依赖于神奇的价值。

如果你喜欢知道问题出在哪里(而且我经常这样做),我觉得最好只考虑程序员错误,以便在集合为空时调用该方法。

答案 1 :(得分:2)

我不认为计数可以被称为NSNotFound。计数只能是0或更多。在我看来,它永远不会 '找不到' 。如果是这种情况,[NSArray count]应该在数组为空或数组为零时返回NSNotFound,对吧?简而言之,我觉得在这种特殊情况下使用NSNotFound并不是一种标准方式。至少苹果从未使用过这种方式。

可能你可以使用零作为默认情况,否则你可能必须定义自己的枚举来表示它。 NSNotFound仅在您不能使用零作为默认值时才有用(对于这些情况,如果可以接受,则可以将-1设为默认值,或者可以使用NSNotFound,因为它代表{{1 }})。

答案 2 :(得分:1)

我知道你来自哪里,特别是考虑到NSNotFound的建议用法。但是,对于继承此代码的后续开发人员,我认为您建议的实现并不直观。

我建议使用NSRange返回值。根据Apple的定义,NSRange是“用于描述系列的一部分的结构 - 例如字符串中的字符或NSArray对象中的对象。”这正是你所拥有的。

具体来说,NSRange的位置成员可以是您在数组中找到的第一个字符串的索引,length成员可以是您找到的字符串数。

与返回NSRange的其他方法(例如,NSString:rangeOfString)一样,如果没有找到字符串,则可以将位置设置为NSNotFound。

希望有所帮助。

答案 3 :(得分:0)

NSNotFound用于无符号整数 所以你应该从NSInteger方法返回它,因为它会被缩短并且是错误的(可能)

表示:**您的方法'countOfStringsInArray'应返回n NSUInteger(与nsarray.count相同)