我正在研究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;
}
答案 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相同)