Cel-C - Usuń ostatni znak z ciągu

Odpowiedzi:

418

W swojej klasie kontrolera utwórz metodę akcji, do której podłączysz przycisk w Interface Builder. Wewnątrz tej metody możesz przyciąć swój ciąg w następujący sposób:


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






Jeśli chcesz zrobić to w fantazyjny sposób w jednej linii kodu, możesz napisać to jako:

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

* Wyjaśnienie fantazyjnego jednowierszowego fragmentu kodu:

Jeśli istnieje znak do usunięcia (tj. Długość ciągu jest większa niż 0)
     (string.length>0)zwraca, w 1 ten sposób kod powraca:
          string = [string substringToIndex:string.length-1];

Jeśli NIE ma znaku do usunięcia (tj. Długość ciąg NIE jest większy niż 0)
     (string.length>0)zwraca, 0 więc kod zwraca:
          string = [string substringToIndex:string.length-0];
     co zapobiega awariom.

Marc Charbonneau
źródło
8
Twoje rozwiązanie ma błąd o 1 błąd. Powinien to być [string substringToIndex: [długość ciągu] - 1];
Jim Correia
Czy „string” odnosi się do „string.text” czy tylko do nazwy ciągu
Omar,
Dzięki Jim, było chyba za wcześnie na arytmetykę. :) Omar, łańcuch odnosi się do zmiennej o nazwie string, która przechowuje tekst, który chcesz zmodyfikować. Możesz przejrzeć dokumentację dotyczącą różnych sposobów tworzenia obiektu NSString z pliku na dysku lub z danych w aplikacji.
Marc Charbonneau
1
@DonalRafferty upewnij się, że twój ciąg nie jest zerowy
quantumpotato
W porządku, jeśli string jest równy nil - wywołanie metody, która zwraca wartość całkowitą, zwróci 0 w Obj-C (zauważ, że to samo NIE jest prawdą dla zwracanych wartości zmiennoprzecinkowych). Więc jeśli stwierdzenie jest równoznaczne z pytaniem string != nil && [string length] > 0. Prawdopodobnie zmienna łańcuchowa Donala została zwolniona.
Marc Charbonneau
53

Jeśli jest to NSMutableString (co polecam, ponieważ zmieniasz go dynamicznie), możesz użyć:

[myString deleteCharactersInRange:NSMakeRange([myRequestString length]-1, 1)];
Dave DeLong
źródło
8

Podane tutaj rozwiązania w rzeczywistości nie uwzględniają wielobajtowych znaków Unicode („znaków złożonych”) i mogą skutkować nieprawidłowymi ciągami znaków Unicode.

W rzeczywistości plik nagłówkowy iOS zawierający deklarację substringToIndexzawiera następujący komentarz:

Wskazówka: używaj z rangeOfComposedCharacterSequencesForRange: aby uniknąć dzielenia złożonych znaków

Zobacz, jakrangeOfComposedCharacterSequenceAtIndex: poprawnie usunąć ostatni znak.

user1071136
źródło
6

Dokumentacja jest twoim przyjacielem, NSStringobsługuje wywołanie, substringWithRangektóre może skrócić ciąg, który masz, zwrócić skrócony String. Nie można zmodyfikować jej wystąpienia NSString, jest niezmienne. Jeśli masz, NSMutableStringto ma wywoływaną metodę, deleteCharactersInRangektóra może modyfikować ciąg w miejscu

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...
Harald Scheirich
źródło
1
NSMakeRange może czasami sprawić, że wypełnienie struktury zakresu będzie wyglądało nieco bardziej elegancko.
dreamlax
@Harald, substringWithRange:zwraca plik NSString*. Zwróć uwagę na wskaźnik.
Thomas Nadin,