Objective-C: rimuove l'ultimo carattere dalla stringa


Risposte:


418

Nella classe del controller, crea un metodo di azione a cui agganci il pulsante in Interface Builder. All'interno di quel metodo puoi tagliare la corda in questo modo:


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






Se vuoi un modo elegante di farlo in una sola riga di codice, puoi scriverlo come:

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

* Spiegazione dello snippet di codice a una riga di fantasia:

se è presente un carattere da eliminare (ovvero la lunghezza della stringa è maggiore di 0)
     (string.length>0)restituisce 1 quindi il codice restituito:
          string = [string substringToIndex:string.length-1];

Se NON è presente un carattere da eliminare (ovvero la lunghezza del stringa NON è maggiore di 0)
     (string.length>0)restituisce 0 quindi il codice restituito:
          string = [string substringToIndex:string.length-0];
     che impedisce arresti anomali.


8
La tua soluzione ha un bug off by 1. Dovrebbe essere [string substringToIndex: [string string] - 1];
Jim Correia,

"Stringa" fa riferimento a "stringa.testo" o solo al nome della stringa
Omar,

Grazie Jim, era troppo presto per l'aritmetica immagino. :) Omar, stringa si riferisce a una variabile chiamata stringa che contiene il testo che si desidera modificare. Puoi dare un'occhiata alla documentazione per i diversi modi in cui puoi creare un oggetto NSString, da un file su disco o dai dati nella tua applicazione.
Marc Charbonneau,

1
@DonalRafferty assicurati che la tua stringa non sia nulla
quantumpotato il

Va bene se la stringa è nulla, la chiamata di un metodo che restituisce un valore intero restituirà 0 in Obj-C (si noti che lo stesso NON è vero per i valori di ritorno in virgola mobile). In modo che se la dichiarazione equivale a chiedere string != nil && [string length] > 0. È probabile che la variabile di stringa di Donal sia stata rilasciata.
Marc Charbonneau,

53

Se è un NSMutableString (che consiglierei poiché lo stai cambiando in modo dinamico), puoi usare:

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

8

Le soluzioni qui fornite in realtà non tengono conto dei caratteri Unicode multi-byte ("caratteri composti") e potrebbero comportare stringhe Unicode non valide.

In effetti, il file di intestazione iOS che contiene la dichiarazione di substringToIndexcontiene il seguente commento:

Suggerimento: utilizzare con rangeOfComposedCharacterSequencesForRange: per evitare la suddivisione dei caratteri composti

Scopri come utilizzarerangeOfComposedCharacterSequenceAtIndex: per eliminare correttamente l'ultimo carattere.


6

La documentazione è tua amica, NSStringsupporta una chiamata substringWithRangeche può accorciare la stringa che hai restituito la stringa accorciata. Non è possibile modificarne un'istanza NSStringimmutabile. Se hai un NSMutableStringis ha un metodo chiamato deleteCharactersInRangeche può modificare la stringa in atto

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

1
NSMakeRange a volte può rendere un po 'più elegante la compilazione di una struttura strutturata.
dreamlax,

@Harald, substringWithRange:restituisce a NSString*. Prendi nota del puntatore.
Thomas Nadin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.