objective-c - 如何枚举符合 NSFastEnumeration 的任意集合

标签 objective-c ios nsenumerator objective-c-protocol

我正在尝试枚举一堆对象,根据情况,这些对象可能是 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 结构。我可以将一个或两个集合转换为一个通用类,但如果可能的话,我想更好地理解这里发生了什么。

最佳答案

objectEnumerator 未在 NSFastEnumeration 协议(protocol)中声明,因此使用 [enumerableSet objectEnumerator]; 将不起作用,因为您正在使用类型 ` id',它没有定义该方法。

由于 objectEnumerator 被声明为 NSArray 和 NSSet 的属性(没有公共(public)父类(super class)),您需要从一个知道它是数组/集合的变量中设置枚举器.即:

NSEnumerator *e = 
(test) ?
[[NSArray arrayWithObjects:@"one", @"two", @"three", nil] objectEnumerator]:
[[NSOrderedSet orderedSetWithObjects:@"one", @"two", @"three", nil] objectEnumerator];

关于objective-c - 如何枚举符合 NSFastEnumeration 的任意集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251327/

相关文章:

ios - 向上滚动时动态设置 UITextView 排除路径会导致无限循环

iphone - UIActionSheet 和 Twitter 用户名选择

ios - 每周询问用户费率

android - Navigator 与 NavigatorIOS React Native 应用程序

ios - 如何为我的 SexyTooltip 实例定义允许的箭头方向?

ios - 如何将用户信息添加到 S3 GetObjectRequest 以识别请求

objective-c - 使用 ACAccountStore 时为 "(null) wants to access twitter"

iOS Web 应用程序禁用偏移滚动

objective-c - Objective-C 中的快速枚举与 NSEnumerator

cocoa - NSEnumerator什么时候完成?