Ziel-C - Entfernen Sie das letzte Zeichen aus der Zeichenfolge


Antworten:


418

Erstellen Sie in Ihrer Controller-Klasse eine Aktionsmethode, mit der Sie die Schaltfläche in Interface Builder verbinden. Innerhalb dieser Methode können Sie Ihre Saite wie folgt kürzen:


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






Wenn Sie eine ausgefallene Methode in nur einer Codezeile suchen, können Sie diese wie folgt schreiben:

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

* Erklärung der Phantasie einzeiligen Code - Schnipsel:

Wenn es ein Zeichen zu löschen ist (dh die Länge der Zeichenfolge größer als 0)
     (string.length>0)kehrt 1 somit den Code Rückkehr zu machen:
          string = [string substringToIndex:string.length-1];

Wenn es kein Zeichen (dh die Länge der löschen ist Zeichenfolge ist NICHT größer als 0) gibt
     (string.length>0)zurück, 0 wodurch der Code zurückgegeben wird:
          string = [string substringToIndex:string.length-0];
     Dies verhindert Abstürze.


8
Ihre Lösung hat einen Fehler von 1. Es sollte [string substringToIndex: [string length] - 1] sein;
Jim Correia

Bezieht sich "string" auf "string.text" oder nur auf den Stringnamen
Omar

Danke Jim, es war wohl zu früh am Morgen, um zu rechnen. :) Omar, Zeichenfolge bezieht sich auf eine Variable namens Zeichenfolge, die den Text enthält, den Sie ändern möchten. In der Dokumentation finden Sie verschiedene Möglichkeiten, wie Sie ein NSString-Objekt erstellen können, entweder aus einer Datei auf der Festplatte oder aus Daten in Ihrer Anwendung.
Marc Charbonneau

1
@DonalRafferty stellen Sie sicher, dass Ihre Zeichenfolge nicht Null ist
quantumpotato

Es ist in Ordnung, wenn der String null ist. Wenn Sie eine Methode aufrufen, die einen ganzzahligen Wert zurückgibt, wird in Obj-C 0 zurückgegeben (beachten Sie, dass dies NICHT für Gleitkomma-Rückgabewerte gilt). Die if-Anweisung entspricht also dem Fragen string != nil && [string length] > 0. Es besteht die Möglichkeit, dass Donals String-Variable über freigegeben wird.
Marc Charbonneau

53

Wenn es sich um einen NSMutableString handelt (den ich empfehlen würde, da Sie ihn dynamisch ändern), können Sie Folgendes verwenden:

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

8

Die hier angegebenen Lösungen berücksichtigen tatsächlich keine Mehrbyte-Unicode-Zeichen ("zusammengesetzte Zeichen") und können zu ungültigen Unicode-Zeichenfolgen führen.

Tatsächlich enthält die iOS-Headerdatei, die die Deklaration von substringToIndexenthält, den folgenden Kommentar:

Hinweis: Mit rangeOfComposedCharacterSequencesForRange verwenden: um zu vermeiden, dass zusammengesetzte Zeichen getrennt werden

Hier erfahren Sie, wie SierangeOfComposedCharacterSequenceAtIndex: das letzte Zeichen korrekt löschen.


6

Die Dokumentation ist dein Freund, NSStringunterstützt einen Aufruf substringWithRange, der die Zeichenfolge verkürzen kann, die du hast, um die verkürzte Zeichenfolge zurückzugeben. Sie können eine Instanz nicht ändern, die NSStringunveränderlich ist. Wenn Sie eine NSMutableStringis haben, wird eine Methode aufgerufen deleteCharactersInRange, mit der die Zeichenfolge geändert werden kann

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

1
Mit NSMakeRange kann das Ausfüllen einer Bereichsstruktur manchmal etwas eleganter aussehen.
Dreamlax

@Harald, substringWithRange:gibt a zurück NSString*. Beachten Sie den Zeiger.
Thomas Nadin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.