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.


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)];

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.


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];
...

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.