2012-02-15 10 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

答えて

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,NSSet、およびNSDictionaryのようなものです。

ファイルに構造化データが含まれていると思われる場合は、フラットファイル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); 
} 

:このような何かは、より良い結果を与える可能性があります。もちろん、これは、入力ファイルが1行に1つのエントリを持つことを前提としています。それが他の方法で構造化されている場合は、それを別の方法で解析する必要があります。

+0

これは完全な意味を持ちますが、依然として出力を返しません。 propernamesファイルは、すべてのMac上のファイル内の名前のリストです。 \ nがデリミタのように見えます。 –

0

ここには間違いがあります。 NSString *は文字列オブジェクトであり、文字配列であるC++で認識される文字列オブジェクトの文字集合ではありません。 for-inループでは、反復処理するコレクションが必要です。 NSArrayまたはNSSetのようなものです。