Swift की Standard Library में काफी सुविधाएँ हैं, लेकिन आप बाहरी लाइब्रेरी और फ्रेमवर्क इम्पोर्ट करके कई और फीचर भी इस्तेमाल कर सकते हैं। ये मॉड्यूल सीधे Swift प्रोजेक्ट से आ सकते हैं (जैसे Swift Argument Parser), Apple के प्लेटफॉर्म फ्रेमवर्क से (जैसे Foundation और Network Framework), या तीसरे पक्ष की ओपन-सोर्स लाइब्रेरी से (जैसे SwiftyBeaver)।
Foundation जैसे मुख्य मॉड्यूल, जो Swift में सबसे ज़्यादा इस्तेमाल होने वाली लाइब्रेरी में से एक है, Swift टूलचेन के साथ ही आते हैं। तीसरे पक्ष की लाइब्रेरी को इम्पोर्ट करने से पहले आपके प्रोजेक्ट कॉन्फिगरेशन में जोड़ना ज़रूरी होता है (उदाहरण के लिए, Swift Package Manager की मदद से)।
मॉड्यूल इम्पोर्ट करने के लिए import कीवर्ड लिखते हैं और उसके बाद मॉड्यूल का नाम लिखते हैं।
तो Foundation इम्पोर्ट करने के लिए अपने प्रोग्राम में यह जोड़ना होगा।
import Foundation
किसी मॉड्यूल को इम्पोर्ट करने से उसके टाइप, मेथड और फंक्शन आपके कोड में इस्तेमाल करने के लिए उपलब्ध हो जाते हैं।
उदाहरण के लिए, Foundation इम्पोर्ट करने से String में components(separatedBy:) जैसी उपयोगी यूटिलिटी मेथड जुड़ जाती हैं।
परंपरा के अनुसार, import स्टेटमेंट Swift फाइल के ऊपर रखे जाते हैं, ताकि कोड पढ़ने वाले किसी भी व्यक्ति को डिपेंडेंसी तुरंत दिख जाएँ।
String के अलग-अलग अक्षरों तक उसी सबस्क्रिप्टिंग तरीके से पहुँचा जा सकता है जो ऐरे के साथ इस्तेमाल होता है।
लेकिन स्ट्रिंग के लिए इस्तेमाल होने वाले इंडेक्स पूर्णांक नहीं होते, और इनके साथ सीधे काम नहीं किया जा सकता।
इसके बजाय इन्हें किसी दूसरे ज्ञात इंडेक्स के आधार पर निकालना पड़ता है, जैसे startIndex।
यह खाली न होने वाली स्ट्रिंग में पहले अक्षर की स्थिति बताता है, और इसके लिए String तथा NSString लाइब्रेरी में उपलब्ध मेथड काम आते हैं (जब Foundation मॉड्यूल इम्पोर्ट होता है, तो Swift की स्ट्रिंग को NSString की सारी प्रॉपर्टी और मेथड मिल जाती हैं)।
उदाहरण के लिए, इस स्ट्रिंग को देखिए:
let csv = "apple,pear,peach,orange,cherry,lime,goosberry"
"orange" में "g" पाने के लिए csv[21] नहीं लिखा जा सकता। इसके लिए String.Index टाइप की एक वैल्यू निकालनी पड़ती है और वही इंडेक्स देना होता है।
ध्यान दीजिए कि ये इंडेक्स अपने आप में इंसानों के पढ़ने के लिए नहीं बने हैं।
इन्हें अपारदर्शी इंडेक्स कहा जाता है, क्योंकि इंसानों को यह जानने की ज़रूरत नहीं होती कि इनके अंदर क्या है।
let index = csv.index(csv.startIndex, offsetBy: 21)
csv[index]
// "g"
print(index)
// prints Index(_rawBits: 1376513)
लेकिन ध्यान दीजिए, अगर ऑफसेट कोई मान्य इंडेक्स न हो, यानी अगर वह startIndex से पहले या endIndex के बाद का इंडेक्स लौटाए, तो यह काम एक एरर देगा और प्रोग्राम क्रैश हो जाएगा।
इस समस्या से बचने के लिए एक सीमा तय करने वाला इंडेक्स दिया जा सकता है।
यह एक ऑप्शनल इंडेक्स लौटाता है और बाकी अमान्य इंडेक्स के लिए nil लौटाता है।
let tooFar = csv.index(csv.startIndex, offsetBy: 200)
// error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
let tooFarButSafe = csv.index(csv.startIndex, offsetBy: 200, limitedBy: csv.endIndex)
// nil
इसके अलावा, इंडेक्स को अलग-अलग स्ट्रिंग के बीच साझा नहीं किया जा सकता।
उदाहरण के लिए, ऊपर "orange" के "g" के लिए निकाला गया index अगर स्ट्रिंग fam = "This is my family: 👨👩👦👦, this is our dog: 🐶, this is our cat: 🐱!" पर इस्तेमाल किया जाए, यानी fam[index], तो आपका प्रोग्राम क्रैश हो जाएगा।
इस सब की कई वजहें हैं, लेकिन मूल बात यही है कि "Unicode पेचीदा है"।
आम तौर पर, अगर आपको अलग-अलग अक्षरों तक सीधे पहुँच चाहिए, तो आपको शायद कोई और डेटा स्ट्रक्चर इस्तेमाल करना चाहिए, जैसे Array<Character>।
Swift में स्ट्रिंग का पहला और अंतिम अक्षर पाने के लिए first और last मेथड हैं।
ये मेथड एक ऑप्शनल अक्षर लौटाते हैं, इसलिए अगर स्ट्रिंग खाली है तो ये nil लौटाते हैं।
let str = "Hello, world!"
print(str.first) // Prints Optional("H")
print(str.last) // Prints Optional("!")
स्ट्रिंग का एक सबस्ट्रिंग पाने के लिए आप prefix और suffix मेथड भी इस्तेमाल कर सकते हैं।
ये मेथड एक पूर्णांक को आर्गुमेंट के रूप में लेते हैं और स्ट्रिंग के पहले या अंतिम n अक्षरों वाला सबस्ट्रिंग लौटाते हैं।
let str = "Hello, world!"
print(str.prefix(5)) // Prints "Hello"
print(str.suffix(6)) // Prints "world!"
टेक्स्ट के साथ काम करना प्रोग्रामिंग में एक आम काम है। Swift, Foundation फ्रेमवर्क के साथ मिलकर, स्ट्रिंग को जाँचने, बदलने और उस पर काम करने के लिए कई सुविधाजनक मेथड और प्रॉपर्टी देता है।
components(separatedBy:) से स्ट्रिंग को तोड़नाकिसी डेलिमिटर के आधार पर स्ट्रिंग को सबस्ट्रिंग के ऐरे में तोड़ने के लिए components(separatedBy:) इस्तेमाल कीजिए (इसके लिए Foundation इम्पोर्ट करना ज़रूरी है):
import Foundation
let sentence = "Hello, world!"
let words = sentence.components(separatedBy: " ")
print(words) // Prints ["Hello,", "world!"]
hasPrefix(_:) और hasSuffix(_:) से प्रीफिक्स और सफिक्स जाँचनायह जाँचने के लिए कि कोई स्ट्रिंग अक्षरों के किसी खास क्रम से शुरू होती है या खत्म होती है, hasPrefix(_:) और hasSuffix(_:) इस्तेमाल कीजिए:
let greeting = "Hello, world!"
print(greeting.hasPrefix("Hello")) // Prints true
print(greeting.hasSuffix("world!")) // Prints true
इन स्टैंडर्ड मेथड और प्रॉपर्टी की मदद से आप स्ट्रिंग का केस बदल सकते हैं:
lowercased(): स्ट्रिंग की लोअरकेस कॉपी लौटाता है।uppercased(): स्ट्रिंग की अपरकेस कॉपी लौटाता है।capitalized: ऐसी कॉपी लौटाता है जिसमें हर शब्द का पहला अक्षर बड़ा होता है (Foundation से)।let greeting = "hello, world!"
print(greeting.lowercased()) // Prints "hello, world!"
print(greeting.uppercased()) // Prints "HELLO, WORLD!"
print(greeting.capitalized) // Prints "Hello, World!"
replacingOccurrences(of:with:) से सबस्ट्रिंग बदलनाकिसी लक्ष्य सबस्ट्रिंग की सारी जगहों को दूसरी स्ट्रिंग से बदलने के लिए replacingOccurrences(of:with:) इस्तेमाल कीजिए (Foundation से):
let greeting = "Hello, world!"
let updated = greeting.replacingOccurrences(of: "world", with: "Swift")
print(updated) // Prints "Hello, Swift!"
joined(separator:) से स्ट्रिंग जोड़नाjoined(separator:) मेथड स्ट्रिंग के कलेक्शन, जैसे [String], पर लागू होता है।
यह किसी सेपरेटर का इस्तेमाल करके एलिमेंट को जोड़कर एक ही स्ट्रिंग बना देता है:
let words = ["Hello", "world"]
let sentence = words.joined(separator: ", ")
print(sentence) // Prints "Hello, world"
शहर में एक नया कविता क्लब खुला है और आप उसमें जाने की सोच रहे हैं। पहले कुछ घटनाएँ हो चुकी हैं, इसलिए क्लब में दरवाज़े को लेकर एक बहुत खास नियम है, जिसे आपको अंदर घुसने से पहले अच्छी तरह समझ लेना होगा।
कविता क्लब में दो दरवाज़े हैं और दोनों पर पहरा है। अंदर जाने के लिए आपको उस दिन का पासवर्ड पता करना होगा:
सबसे पहले आपको कविता को अलग-अलग पंक्तियों में बाँटना होगा। पहरेदार एक कविता सुनाएगा और आपको उसे पंक्तियों में बाँटना होगा।
splitOnNewlines नाम का फंक्शन बनाइए, जो एक स्ट्रिंग लेता है और न्यूलाइन अक्षर को विभाजक मानकर उसे स्ट्रिंग के ऐरे में बाँट देता है।
फंक्शन को स्ट्रिंग का ऐरे लौटाना चाहिए, जिसमें हर स्ट्रिंग कविता की एक पंक्ति हो।
splitOnNewlines("Hello.\nHow are you?\n\nI'm doing fine.")
// returns ["Hello." ,"How are you?", "", "I'm doing fine"].
_ इस्तेमाल कीजिए।उदाहरण के लिए, उनके पसंदीदा लेखकों में से एक Michael Lockwood हैं, जिन्होंने नीचे दी गई अक्रोस्टिक कविता लिखी है, जिसका मतलब है कि हर पंक्ति का पहला अक्षर मिलकर एक शब्द बनाता है:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
जब पहरेदार कविता सुनाएगा, तो आप उसे अलग-अलग पंक्तियों में बाँटेंगे और जवाब में हर पंक्ति का पहला अक्षर देंगे, यानी ["S", "H", "I", "R", "E"].
इसके बाद पहरेदार आपके जवाब में दिए गए अक्षरों के ऐरे से बने शब्द को बड़े अक्षरों वाले रूप में बदलने के लिए आपको देगा।
अंत में आप जो पासवर्ड लौटाएँगे वह "SHIRE" है और आप अंदर पहुँच जाएँगे।
frontDoorPassword नाम का फंक्शन बनाइए, जो कविता को दर्शाने वाली एक स्ट्रिंग लेता है।
फंक्शन को वही पासवर्ड लौटाना चाहिए जो आप पहरेदार को देंगे।
frontDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "SHIRE"
क्लब के पिछले हिस्से में आपको सबसे प्रसिद्ध कवि मिलेंगे, जो VIP क्षेत्र जैसा है। चूँकि यह जगह सबके लिए नहीं है, इसलिए पीछे के दरवाज़े की प्रक्रिया थोड़ी और पेचीदा है।
", please" जोड़ना होगा।उदाहरण के लिए, पहले बताई गई कविता टेलिस्टिक भी है, जिसका मतलब है कि हर पंक्ति का अंतिम अक्षर मिलकर एक शब्द बनाता है:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
जब पहरेदार कविता सुनाएगा, तो आप उसे अलग-अलग पंक्तियों में बाँटेंगे, अंत में आने वाले स्पेस हटाएँगे और जवाब में हर पंक्ति का अंतिम अक्षर देंगे, यानी ["h", "o", "r", "s", "e"].
इसके बाद पहरेदार आपके जवाब में दिए गए अक्षरों के ऐरे से बने शब्द को बड़े अक्षरों वाले रूप में बदलने और उसके अंत में ", please" जोड़ने के लिए आपको देगा।
अंत में आप जो पासवर्ड लौटाएँगे वह "horse, please" है और आप अंदर पहुँच जाएँगे।
backDoorPassword नाम का फंक्शन बनाइए, जो कविता को दर्शाने वाली एक स्ट्रिंग लेता है।
फंक्शन को वही पासवर्ड लौटाना चाहिए जो आप पहरेदार को देंगे।
backDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "horse, please"
क्लब के पिछले कमरे के अंदर एक और दरवाज़ा है, जो उस गुप्त कमरे में ले जाता है जहाँ सिर्फ सबसे बड़े कवि ही जा सकते हैं।
"!" जोड़ना होगा।उदाहरण के लिए, पहले बताई गई कविता का थोड़ा बदला हुआ रूप इस पैटर्न पर खरा उतरता है:
Stands so high
Huge hooves too
Impatiently waits for
Rider with harness
Eager to leave
जब पहरेदार कविता सुनाएगा, तो आप उसे अलग-अलग पंक्तियों में बाँटेंगे, अंत में आने वाले स्पेस हटाएँगे और जवाब में हर पंक्ति का ith अक्षर देंगे, यानी ["S", "u", "p", "e", "r"].
इसके बाद पहरेदार आपके जवाब में दिए गए अक्षरों के ऐरे से बने शब्द को बड़े अक्षरों वाले रूप में बदलने और उसके अंत में "!" जोड़ने के लिए आपको देगा।
अंत में आप जो पासवर्ड लौटाएँगे वह SUPER! है और आप अंदर पहुँच जाएँगे।
secretRoomPassword नाम का फंक्शन बनाइए, जो कविता को दर्शाने वाली एक स्ट्रिंग लेता है।
फंक्शन को वही पासवर्ड लौटाना चाहिए जो आप पहरेदार को देंगे।
secretRoomPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nRider with harness\nEager to leave")
// returns "SUPER!"
Exercism पर साइन अप कीजिए और Swift को 35 कॉन्सेप्ट116 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।