Objective-C - ลบอักขระตัวสุดท้ายออกจากสตริง


คำตอบ:


418

ในคลาสตัวควบคุมของคุณสร้างวิธีการดำเนินการที่คุณจะขอปุ่มถึงในตัวสร้างส่วนต่อประสาน ภายในวิธีนั้นคุณสามารถตัดแต่งสตริงของคุณดังนี้


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






หากคุณต้องการวิธีการที่ยอดเยี่ยมในการทำโค้ดเพียงบรรทัดเดียวคุณสามารถเขียนมันเป็น:

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

* คำอธิบายของโค้ดขนาดหนึ่งบรรทัดแฟนซี:

หากมีอักขระที่จะลบ (เช่นความยาวของสตริงมากกว่า 0)
     (string.length>0)จะส่งคืน1 ดังนั้นการส่งคืนโค้ด:
          string = [string substringToIndex:string.length-1];

หากไม่มีอักขระที่จะลบ (เช่นความยาวของ string มีค่าไม่เกิน 0)
     (string.length>0)ส่งคืน0 ดังนั้นจึงส่งคืนโค้ด:
          string = [string substringToIndex:string.length-0];
     ซึ่งป้องกันการล่ม


8
โซลูชันของคุณมีข้อบกพร่องแบบ off by 1 มันควรจะเป็น [สตริง substringToIndex: [ความยาวสตริง] - 1];
Jim Correia

ไม่ "สตริง" หมายถึง "string.text" หรือเพียงแค่ชื่อสตริง
โอมาร์

ขอบคุณ Jim มันเร็วเกินไปในตอนเช้าสำหรับเลขคณิตฉันเดา :) Omar หมายถึงตัวแปรที่เรียกว่า string ซึ่งเก็บข้อความที่คุณต้องการแก้ไข คุณสามารถดูเอกสารประกอบสำหรับวิธีการต่าง ๆ ที่คุณสามารถสร้างวัตถุ NSString ไม่ว่าจากไฟล์บนดิสก์หรือจากข้อมูลในแอปพลิเคชันของคุณ
Marc Charbonneau

1
@ DonalRafferty ตรวจสอบให้แน่ใจว่าสตริงของคุณไม่ใช่ศูนย์
quantumpotato

ไม่เป็นไรถ้าสตริงเป็นศูนย์ - การเรียกใช้เมธอดซึ่งส่งคืนค่าจำนวนเต็มจะส่งกลับค่า 0 ใน Obj-C (โปรดสังเกตว่าสิ่งเดียวกันนี้ไม่เป็นความจริงสำหรับค่าส่งคืนทศนิยม) string != nil && [string length] > 0เพื่อที่ว่าถ้าคำสั่งจะเทียบเท่ากับการขอให้ โอกาสที่ตัวแปรสตริงของ Donal ถูกปล่อยออกมา
Marc Charbonneau

53

หากเป็น NSMutableString (ซึ่งฉันอยากจะแนะนำเนื่องจากคุณเปลี่ยนมันแบบไดนามิก) คุณสามารถใช้:

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

8

วิธีแก้ปัญหาที่ให้ในที่นี้จริง ๆ แล้วไม่ได้คำนึงถึงอักขระ Unicode หลายไบต์ ("อักขระที่ประกอบด้วย") และอาจทำให้สตริง Unicode ไม่ถูกต้อง

ในความเป็นจริงไฟล์ส่วนหัวของ iOS ซึ่งมีการประกาศsubstringToIndexประกอบด้วยความคิดเห็นต่อไปนี้:

คำแนะนำ: ใช้กับ rangeOfComposedCharacterSequencesForRange: เพื่อหลีกเลี่ยงการทำลายอักขระที่ประกอบขึ้น

ดูวิธีใช้rangeOfComposedCharacterSequenceAtIndex:เพื่อลบอักขระตัวสุดท้ายอย่างถูกต้อง


6

เอกสารประกอบคือเพื่อนของคุณNSStringรองรับการโทรsubstringWithRangeที่สามารถทำให้สตริงสั้นลงว่าคุณได้รับสตริงที่ย่อคืน คุณไม่สามารถแก้ไขอินสแตนซ์ของNSStringมันไม่เปลี่ยนรูป หากคุณมีNSMutableStringคือมีวิธีการที่เรียกdeleteCharactersInRangeว่าสามารถปรับเปลี่ยนสตริงในสถานที่

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

1
NSMakeRange บางครั้งทำให้การกรอกข้อมูลในช่วงโครงสร้างดูสง่างามขึ้น
dreamlax

@Harald, ผลตอบแทนsubstringWithRange: NSString*จดตัวชี้
โทมัสนาดิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.