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: [string string] - 1];
Jim Correia

Чи "посилання" посилається на "string.text" або просто ім'я рядка
Омар

Дякую Джиму, я думаю, було занадто рано вранці для арифметики. :) Omar, рядок посилається на змінну, що називається рядок, яка містить текст, який ви хочете змінити. Ви можете ознайомитись з документацією щодо різних способів створення об’єкта NSString - або з файлу на диску, або з даних у вашій програмі.
Марк Шарбонно

1
@DonalRafferty переконайтеся, що ваша струна не нульова
Quantumpotato

Добре, якщо рядок дорівнює нулю - виклик методу, який повертає ціле число, поверне 0 у Obj-C (зауважте, що це НЕ справедливо для повернених значень з плаваючою комою). Так що, якщо заява еквівалентна запиту string != nil && [string length] > 0. Цілком ймовірно, що змінна строкова зміна Донала надмірно відпускається.
Марк Шарбонно

53

Якщо це NSMutableString (який я рекомендую, оскільки ви динамічно змінюєте його), ви можете використовувати:

[myString deleteCharactersInRange:NSMakeRange([myRequestString length]-1, 1)];

8

Наведені тут рішення фактично не враховують багатобайтові символи Unicode ("складені символи") і можуть призвести до недійсних рядків Unicode.

Фактично, файл заголовка iOS, який містить декларацію, substringToIndexмістить такий коментар:

Підказка: Використовуйте з rangeOfComposedCharacterSequencesForRange: щоб уникнути розбиття складених символів

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


6

Документація є вашим другом, NSStringпідтримує дзвінок, substringWithRangeякий може скоротити рядок, який ви маєте повернути скороченому рядку. Ви не можете змінити його примірник NSString, незмінний. Якщо у вас є NSMutableStringметод, який називається, deleteCharactersInRangeякий може змінювати рядок на місці

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...

1
NSMakeRange іноді може зробити заповнення діапазону структурою трохи елегантнішим.
dreamlax

@Harald, substringWithRange:повертає а NSString*. Візьміть на замітку вказівник.
Томас Надін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.