Objective-C - Remove o último caractere da string

151

No Objective-C para iOS, como removeria o último caractere de uma sequência usando uma ação de botão?

Omar
fonte

Respostas:

418

Na sua classe de controlador, crie um método de ação para o qual você conectará o botão no Interface Builder. Dentro desse método, você pode aparar sua string assim:


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 você quiser uma maneira elegante de fazer isso em apenas uma linha de código, escreva-a como:

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

* Explicação do trecho de código de uma linha sofisticado:

Se houver um caractere a ser excluído (ou seja, o comprimento da string for maior que 0)
     (string.length>0)retornará 1 , fazendo com que o código retorne:
          string = [string substringToIndex:string.length-1];

Se NÃO houver um caractere a ser excluído (ou seja, o comprimento do string NÃO é maior que 0)
     (string.length>0)retorna 0 , fazendo com que o código retorne: O
          string = [string substringToIndex:string.length-0];
     que evita falhas.

Marc Charbonneau
fonte
8
Sua solução possui um erro de 1 por cento. Deve ser [string substringToIndex: [string length] - 1];
9139 Jim Correia
Será que "string" referem-se a "string.text" ou apenas o nome de cadeia
Omar
Obrigado Jim, era muito cedo pela aritmética, eu acho. :) Omar, string refere-se a uma variável chamada string que contém o texto que você deseja modificar. Você pode dar uma olhada na documentação para conhecer as diferentes maneiras de criar um objeto NSString, a partir de um arquivo em disco ou de dados em seu aplicativo.
Marc Charbonneau
1
@DonalRafferty se certificar de sua cadeia não é nulo
quantumpotato
Tudo bem se a string for nula - chamar um método que retorne um valor inteiro retornará 0 em Obj-C (observe que o mesmo NÃO é verdadeiro para valores de retorno de ponto flutuante). Portanto, se a declaração é equivalente a perguntar string != nil && [string length] > 0. Provavelmente, a variável de string de Donal está sendo liberada em excesso.
Marc Charbonneau
53

Se for um NSMutableString (o que eu recomendaria, pois você o altera dinamicamente), você pode usar:

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

As soluções fornecidas aqui, na verdade, não levam em consideração caracteres Unicode de vários bytes ("caracteres compostos") e podem resultar em seqüências de caracteres Unicode inválidas.

De fato, o arquivo de cabeçalho do iOS que contém a declaração de substringToIndexcontém o seguinte comentário:

Dica: Use com rangeOfComposedCharacterSequencesForRange: para evitar a quebra de caracteres compostos

Veja como usarrangeOfComposedCharacterSequenceAtIndex: para excluir o último caractere corretamente.

user1071136
fonte
6

A documentação é sua amiga, NSStringsuporta uma chamada substringWithRangeque pode encurtar a string que você tem para retornar a String encurtada. Você não pode modificar uma instância NSStringdela é imutável. Se você tem um NSMutableStringé chamado um método deleteCharactersInRangeque pode modificar a sequência no lugar

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...
Harald Scheirich
fonte
1
Às vezes, o NSMakeRange pode fazer com que o preenchimento de uma estrutura de intervalo pareça um pouco mais elegante.
Dreamlax #
@Harald, substringWithRange:retorna a NSString*. Tome nota do ponteiro.
9786 Thomas Nadin