Swift में स्ट्रिंग्स: substring आपकी आदत के अनुसार काम क्यों नहीं करता?

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: "पेच", जो हर Swift-डेवलपर का इंतजार करता है

\n\n

एक स्थिति की कल्पना करें: आप Swift में आत्मविश्वास से कोड लिख रहे हैं, सब कुछ सुचारू रूप से चल रहा है, और तभी आपको एक स्ट्रिंग से पहले तीन अक्षर लेने की आवश्यकता है। आप बिना सोचे-समझे कुछ ऐसा लिखते हैं myString[0..<3] — और आपको मिलता है... एक कंपाइलेशन एरर। परिचित लगता है?

\n\n

स्वागत है Swift में String substring की दुनिया में। यह उन विषयों में से एक है जो शुरुआती और यहां तक कि अन्य भाषाओं से आने वाले अनुभवी डेवलपर्स के लिए भी वास्तविक दर्द का कारण बनता है। Stack Overflow पर "How does String substring work in Swift" प्रश्न ने हजारों बार देखा गया है — और यह कोई संयोग नहीं है।

\n\n

इस लेख में, हम यह समझेंगे कि Swift सबस्ट्रिंग के साथ काम करने में इतना "अजीब" क्यों है, Swift में substring का सही तरीके से उपयोग कैसे करें, और नवीनतम संस्करणों में कौन सी नई सुविधाएँ आई हैं। चलिए शुरू करते हैं!

\n\n

Swift स्ट्रिंग का एक टुकड़ा आसानी से काटने की अनुमति क्यों नहीं देता?

\n\n

अधिकांश भाषाओं (Python, JavaScript, C#) में, स्ट्रिंग केवल वर्णों की एक सरणी है। सबस्ट्रिंग चाहिए? str[0:3] लिखें और परिणाम प्राप्त करें। Swift में सब कुछ अलग है।

\n\n

इसका कारण Unicode के साथ काम करना है। Swift में स्ट्रिंग्स केवल बाइट्स या ASCII वर्ण नहीं हैं। वे ग्रैफेम क्लस्टर (grapheme clusters) से बने होते हैं। एक वर्ण जो उपयोगकर्ता देखता है (उदाहरण के लिए, "é" या "👍🏽"), कई Character या कई Unicode.Scalar ले सकता है। कल्पना करें कि आप ऐसे क्लस्टर के बीच में स्ट्रिंग को काट रहे हैं — आपको दूषित डेटा मिलेगा।

\n\n

इसलिए Swift पूर्णांकों के बजाय इंडेक्स (String.Index) का उपयोग करता है। यह गारंटी देता है कि आप कभी भी किसी वर्ण को आधा नहीं काटेंगे।

\n\n

मूल बातें: String.Index और सबस्ट्रिंग का सरल निष्कर्षण

\n\n

आइए एक बुनियादी उदाहरण से शुरू करते हैं। मान लीजिए कि हमारे पास एक स्ट्रिंग है:

\n\n
let fullString = "Привет, Swift!"\n// हम "Swift" शब्द लेना चाहते हैं\nlet startIndex = fullString.index(fullString.startIndex, offsetBy: 8)\nlet endIndex = fullString.index(fullString.startIndex, offsetBy: 13)\nlet substring = fullString[startIndex..<endIndex]\nprint(substring) // आउटपुट: "Swift"
\n\n

ध्यान दें: substring का प्रकार Substring है, String नहीं। यह एक महत्वपूर्ण अंतर है। Substring मूल स्ट्रिंग में एक "खिड़की" है। यह डेटा की प्रतिलिपि नहीं बनाता है, बल्कि केवल मूल स्ट्रिंग के मेमोरी के एक हिस्से को संदर्भित करता है। यह अत्यधिक कुशल है, लेकिन अगर मूल स्ट्रिंग बड़ी है और सबस्ट्रिंग छोटी है तो मेमोरी लीक हो सकती है।

\n\n

Substring को पूर्ण String में बदलने के लिए, बस इनिशियलाइज़र का उपयोग करें:

\n\n
let newString = String(substring)\nprint(newString) // "Swift"
\n\n

सिंटैक्टिक शुगर: RangeExpression

\n\n

हर बार index(offsetBy:) लिखना थकाऊ है। सौभाग्य से, Swift RangeExpression का उपयोग करके छोटे रूपों की अनुमति देता है।

\n\n

ऑपरेटर ... (ClosedRange)

\n
let str = "Hello, World!"\nif let range = str.range(of: "World") {\n    let worldSubstring = str[range]\n    print(worldSubstring) // "World"\n}
\n\n

आंशिक रेंज (Partial Range)

\n

किसी निश्चित इंडेक्स तक या उसके बाद सब कुछ लेना चाहते हैं? आसान है:

\n
let text = "Swift Programming"\nlet prefix = text[..<text.index(text.startIndex, offsetBy: 5)]\nprint(prefix) // "Swift"\n\nlet suffix = text[text.index(text.startIndex, offsetBy: 6)...]\nprint(suffix) // "Programming"
\n\n

ध्यान दें: prefix और suffix भी Substring हैं।

\n\n

अंतर्निहित विधियाँ: prefix, suffix, dropFirst, dropLast

\n\n

Swift सुविधाजनक विधियाँ प्रदान करता है जो मैन्युअल रूप से इंडेक्स की गणना करने से बचाती हैं। ये Substring लौटाती हैं।

\n\n