快速枚举协议的有趣任务

时间:2010-11-03 14:17:33

标签: objective-c cocoa xcode

如何知道支持FE协议,我必须实现方法: - countByEnumeratingWithState:objects:count:

但它的方法是不知道我想枚举什么类型的对象。例如,我的自定义对象有两个数组:

NSArray* names - for NSString objects; 
NSArray* sites - for NSURL objects;

现在我要枚举它们:

for( NSString* name in myObj )
{

}

for( NSURL* url in myObj )
{

}

我可以这样做 - countByEnumeratingWithState:objects:count:定义它必须枚举的对象类型? (不使用其他类属性:))

4 个答案:

答案 0 :(得分:4)

没有。快速枚举每个类只能支持一种类型的枚举,因此您必须决定哪种情况对您更重要。

但是,NSEnumerator也支持快速枚举。因此,您的类可以支持2个不同的枚举器(让我们称之为nameEnumeratorurlEnumerator),然后类的用户就可以使用这样的快速枚举:

for (NSString *name in [myObj nameEnumerator]) { ... }
for (NSURL *url in [myObj urlEnumerator]) { ... }

答案 1 :(得分:2)

不,类型信息不可用。我想不出任何能够以这种方式允许返回类型多态的主流语言,这就是你所要求的。

为什么不简单地将数组公开为属性?

@interface myObj {
     NSArray *names;
     NSArray *sites;
}
@property(readonly) NSArray *names;
@property(readonly) NSArray *sites;
@end

@implementation myObj
@synthesize names, sites;
@end

然后你可以这样做:

for (NSString* name in myObj.names) {

}
for (NSURL* sites in myObj.sites) {

}

答案 2 :(得分:1)

是的,只要您确保只有names中的NSStrings和sites中的NSURL,您就可以这样做。您只能使用“NSString *”进行转换,告诉编译器您知道names包含NSString对象。您实际上并未强制执行这些只是NSString对象。希望有所帮助。

答案 3 :(得分:0)

for([myObj names]中的NSString *名称){...}

for([myObj sites]中的NSURL * url){...}