Objective-C - Eliminar el último carácter de la cadena

Respuestas:

418

En su clase de controlador, cree un método de acción al que conectará el botón en Interface Builder. Dentro de ese método puedes recortar tu cadena de esta manera:


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






Si desea una forma elegante de hacerlo en una sola línea de código, puede escribirlo como:

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

* Explicación del fragmento de código elegante de una línea:

si hay un carácter para eliminar (es decir, la longitud de la cadena es mayor que 0), se
     (string.length>0)devuelve 1 el código:
          string = [string substringToIndex:string.length-1];

si NO hay un carácter para eliminar (es decir, la longitud del código la cadena NO es mayor que 0)
     (string.length>0)devuelve0 lo que hace que el código regrese: lo
          string = [string substringToIndex:string.length-0];
     que evita bloqueos

Marc Charbonneau
fuente
8
Su solución tiene un error por 1 error. Debería ser [string substringToIndex: [string length] - 1];
Jim Correia el
¿"String" se refiere a "string.text" o solo al nombre de la cadena?
Omar el
Gracias Jim, supongo que era demasiado temprano en la mañana para la aritmética. :) Omar, cadena se refiere a una variable llamada cadena que contiene el texto que desea modificar. Puede consultar la documentación de las diferentes formas en que puede crear un objeto NSString, ya sea desde un archivo en el disco o desde datos en su aplicación.
Marc Charbonneau
1
@DonalRafferty asegúrese de que su cadena no sea nula
quantumpotato
Está bien si la cadena es nula: llamar a un método que devuelve un valor entero devolverá 0 en Obj-C (tenga en cuenta que lo mismo NO es cierto para los valores de retorno de coma flotante). Así que si la declaración es equivalente a preguntar string != nil && [string length] > 0. Lo más probable es que la variable de cadena de Donal esté siendo liberada en exceso.
Marc Charbonneau
53

Si es un NSMutableString (que recomendaría ya que lo está cambiando dinámicamente), puede usar:

[myString deleteCharactersInRange:NSMakeRange([myRequestString length]-1, 1)];
Dave DeLong
fuente
8

Las soluciones dadas aquí en realidad no tienen en cuenta los caracteres Unicode de varios bytes ("caracteres compuestos"), y podrían generar cadenas Unicode no válidas.

De hecho, el archivo de encabezado de iOS que contiene la declaración de substringToIndexcontiene el siguiente comentario:

Sugerencia: Use con rangeOfComposedCharacterSequencesForRange: para evitar dividir caracteres compuestos

Vea cómo usarrangeOfComposedCharacterSequenceAtIndex: para eliminar el último carácter correctamente.

usuario1071136
fuente
6

La documentación es su amigo, NSStringadmite una llamada substringWithRangeque puede acortar la cadena que le devuelve la cadena acortada. No puede modificar una instancia de NSStringella es inmutable. Si NSMutableStringtiene un método tiene un método llamado deleteCharactersInRangeque puede modificar la cadena en su lugar

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...
Harald Scheirich
fuente
1
NSMakeRange a veces puede hacer que llenar una estructura de rango se vea un poco más elegante.
dreamlax el
@Harald, substringWithRange:devuelve a NSString*. Toma nota del puntero.
Thomas Nadin