Objective-C - Dizeden son karakteri kaldır


Yanıtlar:


418

Denetleyici sınıfınızda, düğmeyi Arayüz Oluşturucu'ya bağlayacağınız bir eylem yöntemi oluşturun. Bu yöntemin içinde dizenizi şu şekilde kırpabilirsiniz:


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






Bunu sadece bir kod satırında yapmanın süslü bir yolunu istiyorsanız, şöyle yazabilirsiniz:

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

* Süslü tek satırlık kod snippet'inin açıklaması:

Silinecek bir karakter varsa (yani dizenin uzunluğu 0'dan büyükse)
     (string.length>0), 1 böylece kod döndürme yapar:
          string = [string substringToIndex:string.length-1];

Silinecek bir karakter DEĞİLSE (yani dize 0'dan büyük DEĞİLDİR)
     (string.length>0)döndürür 0 böylece kod döndürme:
          string = [string substringToIndex:string.length-0];
     Bu çökmeleri önler.


8
Çözümünüzde 1 hata var. [String substringToIndex: [dize uzunluğu] - 1] olmalıdır;
Jim Correia

"String", "string.text" veya yalnızca dize adını belirtir
Omar

Teşekkürler Jim, sanırım aritmetik için sabah çok erken oldu. :) Ömer, string, değiştirmek istediğiniz metni tutan string adlı bir değişkeni ifade eder. Diskteki bir dosyadan veya uygulamanızdaki verilerden bir NSString nesnesi oluşturmanın farklı yollarına ilişkin belgelere göz atabilirsiniz.
Marc Charbonneau

1
@DonalRafferty dizenizin sıfır olmadığından emin olun
quantumpotato

Dize nil ise sorun değil - bir tamsayı değeri döndüren bir yöntem çağrıldığında Obj-C'de 0 döndürülür (kayan nokta dönüş değerleri için aynı DEĞİLDİR). Yani eğer ifade sormaya eşdeğerse string != nil && [string length] > 0. Muhtemelen Donal'ın dize değişkeni aşırı serbest bırakılıyor.
Marc Charbonneau

53

Bir NSMutableString (dinamik olarak değiştirdiğiniz için tavsiye ederim) ise, kullanabilirsiniz:

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

8

Burada verilen çözümler aslında çok baytlı Unicode karakterleri ("birleşik karakterler") dikkate almaz ve geçersiz Unicode dizeleriyle sonuçlanabilir.

Aslında, bildirimini içeren iOS başlık dosyası substringToIndexaşağıdaki yorumu içerir:

İpucu: Oluşturulan karakterlerin parçalanmasını önlemek için rangeOfComposedCharacterSequencesForRange: ile kullanın

Son karakteri doğru bir şekilde silmek için nasıl kullanılacağınırangeOfComposedCharacterSequenceAtIndex: görün .


6

Belgeler sizin dostunuzdur, kısaltılmış String döndürdüğünüz dizeyi kısaltabilecek NSStringbir aramayı destekler substringWithRange. NSStringDeğişmez bir örneğini değiştiremezsiniz. Eğer bir is'iniz varsa dizeyi yerinde değiştirebilecek NSMutableStringbir yöntem var deleteCharactersInRange.

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

1
NSMakeRange bazen bir aralık yapısını doldurmayı biraz daha zarif gösterebilir.
dreamlax

@Harald, a substringWithRange:döndürür NSString*. İşaretçiyi not edin.
Thomas Nadin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.