3

我有这个代码:

NSIndexSet *indexes = [anOrderedSet indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        if([self testObj: obj]) return YES;
        else return NO;
    }];

    if(indexes == NSNotFound) NSLog(@"No objects were found passing the test");

这会导致 Xcode 发出警告,指出“指针和整数之间的比较('NSIndexSet *' 和 'int')”。我完全同意 Xcode 在这一点上的看法。

但是,该函数的返回值是类型NSIndexSet*和 Apple 文档(http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSOrderedSet_Class/Reference/Reference.html)指出:

返回值
通过谓词指定的测试的有序集中对应值的索引。如果有序集中没有对象通过测试,则返回 NSNotFound.."

那么当函数的返回类型是指向的指针时,返回NSNotFound(这是一个)有什么意义呢?通过将比较更改为以下内容来抑制警告是否安全:NSIntegerNSIndexSet

if(indexes == (NSIndexSet*) NSNotFound) NSLog(@"No objects were found passing the test");

因为,理论上,索引可能是一个有效的返回NSIndexSet指针,它恰好指向一个等于 的内存地址NSNotFound,对吗?

4

2 回答 2

6

恐怕文档是错误的。

你应该检查一个空的NSIndexSet

if ([indexes count] == 0) NSLog(@"No object were found passing the test");

您可能应该向 Apple 打开一个错误报告。

于 2013-06-13T18:08:08.987 回答
1

显然Apple文档不正确。

在我的测试中,我发现如果有序集中没有对象通过测试,那么返回的对象是一个计数为零的 NSIndexSet。

因此,正确的测试是:

if(indexes.count == 0) NSLog(@"No objects were found passing the test");
于 2013-06-13T18:36:51.807 回答