2012-03-17 11 views
0

私はfooArray内のすべての文字列オブジェクトを持つ文字列(foo2)を作成しようとしています。私はなぜ以下の投稿されたコードが私のためにそれをしないのか理解していない。forループは変数にデータを保存しません

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSString *foo [email protected]"This is just a test"; 
    NSArray *fooArray = [foo componentsSeparatedByString:@" "]; 

    for(int i=0; i < fooArray.count; i++) 
    { 
     _foo2= [_foo2 stringByAppendingString:[ fooArray objectAtIndex:i]]; 
    } 

    NSLog(_foo2); 
} 

答えて

0

私はあなたがviewDidLoad実行する前_foo2のどこを初期化されていないからだと推測しています。 _foo2はまだ初期化されておらず、まだポインタがゼロであるので、メッセージをstringByAppendingString:に送信するたびに、結果はゼロになります。

ループの前に_foo2を新しいNSMutableStringオブジェクトに初期化することでこれを修正できます。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSString *foo [email protected]"This is just a test"; 
    NSArray *fooArray = [foo componentsSeparatedByString:@" "]; 

    _foo2 = [[NSMutableString alloc] init]; 
    for(int i=0; i < fooArray.count; i++) 
    { 
     _foo2= [_foo2 stringByAppendingString:[ fooArray objectAtIndex:i]]; 
    } 

    NSLog(_foo2); 
} 
+0

ここでNSMutableStringを使用すると、余計なことがあります: 'stringbyAppendingString:'は受信者の内容に引数を付加した新しい文字列を作成します。受信者が変更可能かどうかは関係ありません。さらに、 'alloc'を使って作成すると、ループの最初の繰り返しで漏れてしまうことになります(ARCを使用していない限り、これは想定できません)。そして、すべてのことの上に、ニールスが達成しようとしているものに応じて、必ずしもループが必要なわけではありません。コメントで詳しく説明するにはあまりにも多くのことがあります。完全な話の私の答えを見てください。 – rickster

+0

新しい質問を詳細に掲載しました。うまくいけば分かりやすいでしょう:)新しい質問は次の通りです。xcodeのtxtドキュメントの構文解析ツール –

0

あなたがしたいすべてが検討し、文字列からストリップスペースの場合:

_foo2 = [foo stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
// or whitespaceAndNewlineCharacterSet, if that fits your use case better 

もう少し具体的にしたい場合は、あります:

_foo2 = [foo stringByReplacingOccurrencesOfString:@" " withString:@""]; 

以上にあなたがやっていることのセマンティクスに一層密接に従ってください:

NSArray *fooArray = [foo componentsSeparatedByString:@" "]; 
_foo2 = [fooArray componentsJoinedByString:@""]; 

そして、あなたは本当に(おそらく各単語のいくつかの処理を行うには?)それをループにしたい何らかの理由で、それを行うにはいくつかの方法がある場合:

NSArray *fooArray = [foo componentsSeparatedByString:@" "]; 

_foo2 = [NSMutableString string]; 
for (int i = 0; i < fooArray.count; i++) { 
    [_foo2 appendString:[fooArray objectAtIndex:i]]; 
} 

または:

NSArray *fooArray = [foo componentsSeparatedByString:@" "]; 

_foo2 = @""; // equivalent to [NSString string] 
for (int i = 0; i < fooArray.count; i++) { 
    _foo2 = [_foo2 stringByAppendingString:[fooArray objectAtIndex:i]]; 
} 

(それは高速列挙も考慮していません。別名for..inです)同じNSMutableStringに繰り返し追加することは、新しい文字列を作成するよりも安価で、古いものを投げるよりも、最初のループが効率的です。

+0

本当にやろうとしていたことは、NSarrayにテキストドキュメントを読み込んで、それから単語を取り出したいということでした。配列を通って各単語を個体として見る方法があるかどうか知っていますか?だから私は特別な単語に行くと、私はそれのインデックスを取得し、そのインデックスの前に単語を選択することができますか?私の大きな問題は、このテキスト文書に改行もあります。 –

+0

これらのループでは、 '[fooArray objectAtIndex:i]'は* i *番目の単語だけを含む文字列です。 。もしあなたが望む言葉であれば、fooArrayの '0'から' i - 1'までのインデックスにある言葉は... 'subarrayWithRange:'はあなたが何をしたいかに応じて何かをするのに役立ちます。あなたの質問を編集するか、別のものを投稿して後で詳しく説明し、より詳細な回答を提供することができます。 – rickster

関連する問題