7

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

苹果的文档状态:

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

4 回答 4

5

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

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

如果您喜欢知道问题出在哪里(我自己也经常这样做),我发现当集合为空时调用该方法是程序员错误更可取。

于 2012-11-09T07:04:28.073 回答
2

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

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

于 2012-11-09T06:54:09.603 回答
1

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

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

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

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

希望有帮助。

于 2012-11-09T07:22:05.123 回答
0

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

那说:**你的方法'countOfStringsInArray'应该返回n NSUInteger(与nsarray.count相同)

于 2012-11-09T07:30:26.453 回答