2012-03-17 94 views
0

我想创建一个字符串(foo2),它将具有fooArray中的所有字符串对象。我不明白为什么下面发布的代码不会为我做。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,这还不是安全的假设)。除此之外,你根本不需要循环,这取决于@Niels试图完成什么。在评论中有太多的细节需要讨论;看完整故事的答案。 – rickster 2012-03-17 20:29:38

+0

我发布了一个更详细的新问题。希望这会更容易理解:)新的问题是:通过xcode中的txt文档进行解析器 – 2012-03-17 22:01:18

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,然后从中获取单词,这是我想要的。你知道是否有办法通过一个阵列并将每个单词作为一个个体来看待?所以,一旦我去了一个特殊的词,我可以得到的索引,并选择该索引之前的单词?我的大问题是在这个文本文件中也有换行符...... – 2012-03-17 21:33:33

+0

在那些循环中,'[fooArray objectAtIndex:i]'是一个只包含第*个第*个字的字符串......你可以检查它,但是你喜欢。如果它是你想要的单词,它之前的单词在fooArray ...'subarrayWithRange:'的索引'0'到'i - 1'中可能会帮助你对它们做些什么,具体取决于你想做什么。编辑您的问题或张贴详细描述您的问题,我们可以提供更详细的答案。 – rickster 2012-03-17 21:47:36