【问题标题】:Is returning NSNotFound for NSUInteger advisable?为 NSUInteger 返回 NSNotFound 是否可取?
【发布时间】:2012-11-09 06:41:49
【问题描述】:

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

Apple 的文档状态:

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

如果我将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;
}

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        希望对您有所帮助。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-25
            • 2011-01-28
            • 2013-01-08
            相关资源
            最近更新 更多