2012-02-15 145 views
1

得到一个警告说:快速枚举错误?

集合表达型 '的NSString *' 可不回应'countByEnumeratingWithState:对象:伯爵

试图运行下面的代码时:

NSString *proper = [NSString stringWithContentsOfFile:@"usr/share/dict/propernames"  encoding:NSUTF8StringEncoding error:NULL]; 


for (NSString *i in proper){ 
     NSLog(@"Item>%@", i); 
     } 

当我运行该程序,我没有从NSLog语句中得到任何输出。任何人遇到这个?

+2

'NSString'是一个'集合'? – aroth 2012-02-15 00:21:48

回答

0

加载文件后,将其拆分为与componentsSeparatedByString:。

NSArray *lines = [proper componentsSeparatedByString:@"\n"]; // Use the correct line ending character here 
for (NSString *i in lines) { 
    NSLog(@"item> %@", i); 
} 
3

编译器警告是想告诉你,你可以不使用for ... in ...循环遍历一个NSString。它进一步试图说,原因是NSString不是一个有效的“集合”类型。您的有效“收集”类型类似NSArray,NSSetNSDictionary

因此,如果您的文件应该包含结构化数据,则应该将其解析为比平面NSString更有用的东西。像这样的东西可能会给出更好的结果:

NSString* temp = [NSString stringWithContentsOfFile:@"usr/share/dict/propernames"  encoding:NSUTF8StringEncoding error:NULL]; 
NSArray* proper = [temp componentsSeparatedByString:@"\n"]; 

for (NSString* i in proper){ 
    NSLog(@"Item>%@", i); 
} 

这将打印文件中的每一行。当然,这假定您的输入文件每行有一个条目。如果它是以其他方式构建的,那么您将不得不以不同的方式进行解析。

+0

这使得完全有意义,但仍然不返回任何输出。正确的名称文件只是所有Mac上文件中的名称列表。看起来\ n将是分隔符。 – 2012-02-15 03:15:43

0

这是你在这里的一个明显的错误。 NSString *是一个字符串对象,并不是字符集合,而是C++中已知的字符串对象,它是一个字符数组。 for-in Loop需要一个集合来迭代。像NSArray或NSSet。