Как объединить строку в Objective-C (iPhone)?

Возможный дубликат:
Как мне объединить строки в Objective-C?

Во-первых, платформа - это iPhone, и label.text меняет отображаемую метку. Рассмотрим этот сценарий:

У меня есть массив целых чисел. И я хочу вывести это на экран.

Вот мой взгляд на это:

-(IBAction) updateText: (id)sender {
   int a[2];
   a[0]=1;
   a[1]=2;
   a[2]=3;
   for (int i=0; i<=10;i++)
     label.text = [NSString stringByAppendingString: [NSString stringWithFormat: @"%i", a[i]]]; 
}

Как вы, наверное, видите, я очень запутался. Пожалуйста, помогите мне :(


person r0ach    schedule 21.07.2009    source источник
comment
Немного поздно, но вы инициализируете свой массив размером 2, поэтому наивысший индекс будет 1, но вы делаете [2] = 3; что приведет к ошибке за пределами допустимого диапазона.   -  person Jonny    schedule 10.06.2011


Ответы (3)


Попробуй это:

NSMutableString* theString = [NSMutableString string];
for (int i=0; i<=10;i++){
    [theString appendString:[NSString stringWithFormat:@"%i ",i]];
}
label.text = theString;
person Tom Dalling    schedule 21.07.2009
comment
Это возможно только в NSMutableString, верно? Меня путают все эти разные классы и их методы ... Но, спасибо, чувак. Это как раз то, что мне нужно. :) - person r0ach; 21.07.2009
comment
appendString: есть только в NSMutableString, но аналогичная функция - stringByAppendingString: в NSString. - person Tom Dalling; 22.07.2009
comment
@TomDalling: я использовал тот же подход, но 'theString' объявлен в файле .h, поскольку делегат, внутри которого выполняется добавление, вызывается несколько раз. Теперь в этом случае я получаю пустую строку 'theString'. Любое исправление? - person Jayprakash Dubey; 15.10.2014

Поскольку вы используете цикл, будьте осторожны с решениями Тома и Бенджи. Каждый из них создает дополнительный автоматически выпускаемый объект за итерацию. Для небольшого цикла это нормально, но если размер цикла неограничен или если строки большие, это может привести к очень большому всплеску памяти и снижению производительности. В частности, на iPhone это именно тот цикл, который может привести к неожиданным проблемам с памятью из-за кратковременных всплесков памяти.

Следующее решение требует меньшего объема памяти (оно также немного быстрее и требует меньшего набора текста). Обратите внимание на вызов -appendFormat:, а не -appendString. Это позволяет избежать создания второй строки, которая будет выброшена. Помните, что в последней строке есть лишний пробел в конце, от которого вы, возможно, захотите избавиться. Вы можете исправить это, обрабатывая первую или последнюю итерацию по-разному, или обрезая последний пробел после цикла.

NSMutableString* theString = [NSMutableString string];
for (int i=0; i<=10;i++){
    [theString appendFormat:@"%i ",i];
}
label.text = theString;

Не забывайте [NSArray componentsJoinedByString:]. В этом случае у вас нет массива NSArray, но в тех случаях, когда он у вас есть, это, вероятно, лучший способ получить то, что вы ищете.

person Rob Napier    schedule 21.07.2009

Другой метод без использования NSMutableString:

NSString* theString = @"";
for (int i=0; i<=10;i++){
    theString = [theString stringByAppendingFormat:@"%i ",i];
}
label.text = theString;

Вот полная реализация (исправление ваших диапазонов):

-(IBAction) updateText: (id)sender {
     int a[3];
     a[0]=1;
     a[1]=2;
     a[2]=3;
     NSString *str = @"";
     for (int i=0; i<3;i++)
       str = [str stringByAppendingFormat:@"%i ",i];
     label.text = str;
}

Вы также можете сделать это так (например, если вам нужен список, разделенный запятыми):

-(IBAction) updateText: (id)sender {
     int a[3];
     a[0]=1;
     a[1]=2;
     a[2]=3;
     NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3];
     for (int i=0; i<3;i++)
         [arr addObject:[NSString stringWithFormat:@"%i",i]];

     label.text = [arr componentsJoinedByString:@", "];
}
person Benjie    schedule 21.07.2009
comment
Хотя программист LISP во мне предпочитает подход NSString NSMutableString, вы действительно должны быть осторожны с воздействием на память вашего первого решения. Для такого маленького цикла это не имеет большого значения, но это O (n ^ 2) в памяти и может вызвать проблемы на iPhone, где даже кратковременный всплеск памяти является проблемой. - person Rob Napier; 21.07.2009
comment
Совершенно верно. По этой причине метод массива намного лучше. (Было бы еще лучше, если бы я сделал [NSMutableArray alloc] и [arr release] ...) Это также дает дополнительную гибкость в соединяемой строке, не беспокоясь о пропущении запятой или пробела в начале или конце списка. - person Benjie; 22.07.2009