उद्देश्य-सी - स्ट्रिंग से अंतिम वर्ण निकालें


151

IOS के लिए ऑब्जेक्टिव-सी में, मैं एक बटन एक्शन का उपयोग करके स्ट्रिंग के अंतिम चरित्र को कैसे हटाऊंगा?

जवाबों:


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];

यदि हटाने के लिए कोई वर्ण नहीं है (यानी लंबाई स्ट्रिंग 0 से अधिक) नहीं है
     (string.length>0)रिटर्न 0 : इस प्रकार कोड में वापसी
          string = [string substringToIndex:string.length-0];
     कौन रोकता दुर्घटनाओं।


8
आपके समाधान में 1 बग बंद है। यह होना चाहिए [स्ट्रिंग substringToIndex: [स्ट्रिंग लंबाई] - 1];
जिम कोर्रेया

क्या "स्ट्रिंग" का अर्थ "स्ट्रिंग.टेक्स्ट" या सिर्फ स्ट्रिंग नाम है
उमर

धन्यवाद जिम, यह अंकगणित मुझे लगता है कि सुबह में बहुत जल्दी था। :) उमर, स्ट्रिंग एक चर को संदर्भित करता है जिसे स्ट्रिंग कहा जाता है जो उस पाठ को रखता है जिसे आप संशोधित करना चाहते हैं। आप उन विभिन्न तरीकों के लिए दस्तावेज़ीकरण पर एक नज़र डाल सकते हैं जिन्हें आप एनएसएसट्रिंग ऑब्जेक्ट बना सकते हैं, या तो डिस्क पर फ़ाइल से या आपके एप्लिकेशन में डेटा से।
मार्क चारबोनो

1
@DonalRafferty सुनिश्चित करें कि आपका स्ट्रिंग शून्य नहीं है
quantumpotato

यह ठीक है अगर स्ट्रिंग शून्य है - एक विधि को कॉल करना जो पूर्णांक मान लौटाता है 0 ओज-सी में वापस आएगा (ध्यान दें कि फ्लोटिंग पॉइंट रिटर्न मानों के लिए भी यह सच नहीं है)। ताकि यदि कथन पूछने के बराबर है string != nil && [string length] > 0। संभावना है कि डोनल के स्ट्रिंग चर को जारी किया जा रहा है।
मार्क चारबोनो 18

53

यदि यह एक NSMutableString है (जो मैं आपको गतिशील रूप से बदलने के बाद से सुझाऊंगा), आप उपयोग कर सकते हैं:

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

8

यहां दिए गए समाधान वास्तव में मल्टी-बाइट यूनिकोड वर्ण ("रचित वर्ण") को ध्यान में नहीं रखते हैं, और इसके परिणामस्वरूप अमान्य यूनिकोड तार हो सकते हैं।

वास्तव में, आईओएस हेडर फाइल जिसमें substringToIndexनिम्नलिखित टिप्पणी होती है, की घोषणा होती है:

संकेत: रेंजऑफ कॉमपोज्डड्रेचरस असमानता के साथ प्रयोग करें। रंज: टूटे हुए पात्रों को तोड़ने से बचने के लिए

अंतिम वर्ण को सही ढंग से हटाने के लिए उपयोग करने का तरीकाrangeOfComposedCharacterSequenceAtIndex: देखें ।


6

प्रलेखन आपका मित्र है, NSStringएक कॉल का समर्थन करता है substringWithRangeजो स्ट्रिंग को छोटा कर सकता है जो आपके पास एक छोटी स्ट्रिंग है। आप इसका एक उदाहरण संशोधित नहीं कर सकते NSStringअपरिवर्तनीय है। यदि आपके पास NSMutableStringएक विधि है जिसे बुलाया जाता है deleteCharactersInRangeजो स्ट्रिंग को जगह में संशोधित कर सकता है

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

1
NSMakeRange कभी-कभी एक सीमा संरचना को भरने के लिए थोड़ा और अधिक सुरुचिपूर्ण बना सकता है।
ड्रीमलैक्स

@ हैराल्ड, substringWithRange:रिटर्न ए NSString*। पॉइंटर पर ध्यान दें।
थॉमस नादिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.