цикл не сохраняет данные в переменной - PullRequest
0 голосов
/ 17 марта 2012

Я пытаюсь создать строку (foo2), которая будет содержать весь строковый объект в массиве fooArray. Я не понимаю, почему приведенный ниже код не делает это для меня.

- (void)viewDidLoad
{ 
    [super viewDidLoad];
    NSString *foo =@"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);
}

Ответы [ 2 ]

0 голосов
/ 18 марта 2012

Если все, что вы хотите сделать, это убрать пробелы из строки, подумайте:

_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 голосов
/ 17 марта 2012

Полагаю, это потому, что вы не инициализируете _foo2 нигде до запуска viewDidLoad.И поскольку _foo2 не был инициализирован и по-прежнему является нулевым указателем, каждый раз, когда вы отправляете ему сообщение stringByAppendingString:, результат по-прежнему равен нулю.

Это можно исправить, инициализируя _foo2 новой NSMutableStringобъект перед вашей петлей.

- (void)viewDidLoad
{ 
    [super viewDidLoad];
    NSString *foo =@"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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...