Objective-C - удалить последний символ из строки

Ответы:

418

В вашем классе контроллера создайте метод действия, к которому вы подключите кнопку в Интерфейсном Разработчике. Внутри этого метода вы можете обрезать вашу строку следующим образом:


if ([string length] > 0) {
    string = [string substringToIndex:[string length] - 1];
} else {
    //no characters to delete... attempting to do so will result in a crash
}






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

string = [string substringToIndex:string.length-(string.length>0)];

* Объяснение причудливого фрагмента однострочного кода:

если есть символ, который нужно удалить (т. Е. Длина строки больше 0), то
     (string.length>0)возвращается 1 код, возвращающий код:
          string = [string substringToIndex:string.length-1];

если нет символа, который нужно удалить (т. Е. Длина строка НЕ ​​больше 0)
     (string.length>0)возвращает, 0 что делает возврат кода:
          string = [string substringToIndex:string.length-0];
     что предотвращает сбои.

Марк Шарбонно
источник
8
У вашего решения есть ошибка на 1. Это должно быть [string substringToIndex: [длина строки] - 1];
Джим Коррейя
«Строка» относится к «string.text» или просто к имени строки
Омар
Спасибо, Джим, я думаю, было слишком рано для арифметики. :) Омар, строка относится к переменной с именем string, которая содержит текст, который вы хотите изменить. Вы можете взглянуть на документацию для различных способов создания объекта NSString, либо из файла на диске, либо из данных в вашем приложении.
Марк Шарбонно
1
@DonalRafferty убедитесь, что ваша строка не ноль
Quantumpotato
Это нормально, если строка имеет значение nil - вызов метода, который возвращает целочисленное значение, вернет 0 в Obj-C (обратите внимание, что то же самое НЕ верно для возвращаемых значений с плавающей запятой). Так что, если утверждение эквивалентно запросу string != nil && [string length] > 0. Скорее всего, строковая переменная Донала переиздается.
Марк Шарбонно
53

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

[myString deleteCharactersInRange:NSMakeRange([myRequestString length]-1, 1)];
Дэйв Делонг
источник
8

Приведенные здесь решения на самом деле не учитывают многобайтовые символы Юникода («составные символы») и могут привести к недопустимым строкам Юникода.

Фактически, заголовочный файл iOS, который содержит объявление, substringToIndexсодержит следующий комментарий:

Подсказка: используйте с rangeOfComposedCharacterSeptionsForRange: чтобы не разбивать составные символы

Посмотрите, как правильно использоватьrangeOfComposedCharacterSequenceAtIndex: последний символ.

user1071136
источник
6

Документация вашего друга, NSStringподдерживает вызов, substringWithRangeкоторый может сократить строку, которую вы возвращаете, сокращенную строку. Вы не можете изменить его экземпляр NSStringнеизменным. Если у вас есть NSMutableStringis есть метод, deleteCharactersInRangeкоторый может изменить строку на месте

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...
Харальд Шейрих
источник
1
NSMakeRange иногда может сделать заполнение структуры диапазона более элегантным.
Dreamlax
@Harald, substringWithRange:возвращает NSString*. Обратите внимание на указатель.
Томас Надин