2012-02-15 176 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。