सभी निम्नलिखित उदाहरणों का उपयोग करते हैं
var str = "Hello, playground"
स्विफ्ट 4
स्ट्रिंग्स को स्विफ्ट 4 में बहुत बड़ा ओवरहॉल मिला। जब आप स्ट्रिंग से कुछ विकल्प प्राप्त करते हैं, तो आपको एक के Substring
बजाय एक प्रकार मिलता हैString
। ऐसा क्यों है? स्विफ्ट में स्ट्रिंग्स मान प्रकार हैं। इसका मतलब है कि यदि आप एक नया बनाने के लिए एक स्ट्रिंग का उपयोग करते हैं, तो इसे कॉपी करना होगा। यह स्थिरता के लिए अच्छा है (कोई और आपकी जानकारी के बिना इसे बदलने वाला नहीं है) लेकिन दक्षता के लिए बुरा है।
दूसरी ओर, एरिकिंग, मूल स्ट्रिंग का एक संदर्भ है, जिसमें से यह आया था। यहाँ से एक छवि है प्रलेखन कि दर्शाता हुआ।
किसी भी नकल की आवश्यकता नहीं है, इसलिए यह उपयोग करने के लिए बहुत अधिक कुशल है। हालाँकि, कल्पना कीजिए कि आपको एक दस चरित्र मिला है, जो एक लाख अक्षर स्ट्रिंग से है। क्योंकि सबस्ट्रिंग स्ट्रिंग को संदर्भित कर रहा है, सिस्टम को पूरे स्ट्रिंग पर तब तक पकड़ना होगा जब तक सबस्ट्रिंग चारों ओर है। इस प्रकार, जब भी आप अपने सबस्ट्रिंग में हेरफेर करते हैं, तो उसे स्ट्रिंग में बदल दें।
let myString = String(mySubstring)
यह सिर्फ सब्स्टिट्यूटिंग को कॉपी करेगा और पुराने स्ट्रिंग को रखने वाली मेमोरी को रिकवर किया जा सकता है । सबस्ट्रिंग (एक प्रकार के रूप में) का अर्थ अल्पकालिक होना है।
स्विफ्ट 4 में एक और बड़ा सुधार यह है कि स्ट्रिंग्स कलेक्शन (फिर से) हैं। इसका मतलब है कि आप एक संग्रह के लिए जो कुछ भी कर सकते हैं, आप एक स्ट्रिंग के लिए कर सकते हैं (सदस्यता का उपयोग करें, वर्णों पर पुनरावृति करें, फ़िल्टर करें, आदि)।
निम्नलिखित उदाहरण दिखाते हैं कि स्विफ्ट में एक विकल्प कैसे प्राप्त करें।
उपजाऊ होना
(उदाहरण के लिए, सबस्क्रिप्ट या अन्य तरीकों की एक संख्या का उपयोग करके एक स्ट्रिंग से सबस्ट्रिंग प्राप्त कर सकते हैं prefix
, suffix
, split
)। आपको अभी भी रेंज के लिए String.Index
एक Int
इंडेक्स का उपयोग करने और नहीं करने की आवश्यकता है , हालांकि। ( मेरा अन्य उत्तर देखें यदि आप के साथ मदद की जरूरत हो तो ।)
एक तार की शुरुआत
आप एक सबस्क्रिप्ट का उपयोग कर सकते हैं (स्विफ्ट 4 एक तरफा सीमा पर ध्यान दें):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
या prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
या इससे भी आसान:
let mySubstring = str.prefix(5) // Hello
एक तार का अंत
सदस्यता का उपयोग करना:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
या suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
या इससे भी आसान:
let mySubstring = str.suffix(10) // playground
ध्यान दें कि उपयोग करते समय suffix(from: index)
मुझे उपयोग करके अंत से वापस गिनती करना था -10
। यह जरूरी नहीं है कि बस का उपयोग करते समय suffix(x)
, जो सिर्फ x
एक स्ट्रिंग के अंतिम पात्रों को लेता है ।
एक स्ट्रिंग में रेंज
फिर से हम यहां केवल सदस्यता का उपयोग करते हैं।
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
में परिवर्तित Substring
हो रहा हैString
मत भूलो, जब आप अपने प्रतिस्थापन को बचाने के लिए तैयार हैं, तो आपको इसे परिवर्तित करना चाहिए String
ताकि पुराने स्ट्रिंग की मेमोरी को साफ किया जा सके।
let myString = String(mySubstring)
Int
सूचकांक विस्तार का उपयोग करना ?
एयरस्पेड वेलोसिटी और ओले बेइमान द्वारा Int
लेख स्ट्रिंग्स 3 इन स्विफ्ट 3 को पढ़ने के बाद मैं एक आधारित सूचकांक विस्तार का उपयोग करने में संकोच कर रहा हूं । हालांकि स्विफ्ट 4 में, स्ट्रिंग्स संग्रह हैं, स्विफ्ट टीम ने जानबूझकर Int
अनुक्रमित का उपयोग नहीं किया है । यह अभी भी है String.Index
। यह स्विफ्ट वर्णों को यूनिकोड कोडपॉइंट्स की अलग-अलग संख्याओं से बना होता है। वास्तविक सूचकांक को प्रत्येक स्ट्रिंग के लिए विशिष्ट रूप से गणना करना होगा।
मुझे कहना है, मुझे आशा है कि स्विफ्ट टीम String.Index
भविष्य में दूर रहने का एक रास्ता खोज लेती है । लेकिन जब तक मैं उनके एपीआई का उपयोग करना चुन रहा हूं। यह मुझे याद रखने में मदद करता है कि स्ट्रिंग जोड़तोड़ केवल साधारण Int
सूचकांक लुकअप नहीं हैं।