0

我试图枚举一堆对象,根据情况,这些对象可能是 NSArray 或 NSOrderedSet。由于两者都符合 NSFastEnumeration,我希望这可以工作:

id<NSFastEnumeration> enumerableSet =
(test) ?
[NSArray arrayWithObjects:@"one", @"two", @"three", nil] :
[NSOrderedSet orderedSetWithObjects:@"one", @"two", @"three", nil];

NSEnumerator *e = [enumerableSet objectEnumerator];

但是,我收到以下编译器错误:

选择器“objectEnumerator”没有已知的实例方法。

我怀疑这里有一些语法错误,我之前没有使用 id 构造。我可以将一组或两组转换为一个通用类,但如果可能的话,我想更好地了解这里发生了什么。

4

3 回答 3

4

objectEnumerator未在NSFastEnumeration协议中声明,因此 using[enumerableSet objectEnumerator];将不起作用,因为您正在使用未定义该方法的类型“id”。

由于objectEnumerator被声明为 NSArray 和 NSSet 的属性(没有公共超类),因此您需要从知道它是数组/集合的变量中设置枚举数。IE:

NSEnumerator *e = 
(test) ?
[[NSArray arrayWithObjects:@"one", @"two", @"three", nil] objectEnumerator]:
[[NSOrderedSet orderedSetWithObjects:@"one", @"two", @"three", nil] objectEnumerator];
于 2012-09-03T16:32:43.697 回答
1

好吧,那算了。我刚刚找到了我的答案。objectEnumerator 不是协议的一部分 - 所以虽然 NSArray 和 NSOrderedSet都有objectEnumerator 消息,但我不能这样使用它。相反,这似乎有效:

NSEnumerator *e =
(test) ?
[[NSArray arrayWithObjects:@"one", @"two", @"three", nil] objectEnumerator]:
[[NSOrderedSet orderedSetWithObjects:@"one", @"two", @"three", nil] objectEnumerator];
于 2012-09-03T16:33:15.427 回答
0

您有符合NSFastEnumeration协议的对象,但您正在尝试将“慢”枚举与NSEnumerator. 相反,使用快速枚举:

id<NSFastEnumeration> enumerableSet =
(test) ?
[NSArray arrayWithObjects:@"one", @"two", @"three", nil] :
[NSOrderedSet orderedSetWithObjects:@"one", @"two", @"three", nil];

for (id object in enumerableSet) {
    // ...
}

请参阅快速枚举使在 Apple 的Objective-C 编程中枚举集合变得容易

NSEnumerator我建议尽可能使用快速枚举;快速枚举更清晰、更简洁、更快。

于 2014-07-07T09:57:49.727 回答