ट्रैक
/
Swift
Swift
/
अभ्यास
/
विशेषज्ञ मिक्सोलॉजिस्ट
विशेषज्ञ मिक्सोलॉजिस्ट

विशेषज्ञ मिक्सोलॉजिस्ट

सीखने का अभ्यास

परिचय

Switch

एक switch स्टेटमेंट की मदद से आप एक वैल्यू की तुलना कई संभावित वैल्यूओं से कर सकते हैं, जिनसे वह मेल खा सकती है। यह आपको कई else-if स्टेटमेंट इस्तेमाल करने की तुलना में ज़्यादा संक्षिप्त कोड लिखने देता है। एक switch स्टेटमेंट switch कीवर्ड से शुरू होता है, जिसके बाद वह वैल्यू आती है जिसकी तुलना करनी है। इसके बाद आप case कीवर्ड से केस बनाते हैं, जिसके बाद वह वैल्यू आती है जिससे तुलना करनी है। जब कोई भी केस मेल न खाए, तो डिफॉल्ट केस बनाने के लिए default कीवर्ड इस्तेमाल किया जाता है। else-if स्टेटमेंट की तरह, switch स्टेटमेंट भी सिर्फ पहले मेल खाने वाले केस से जुड़ा कोड ब्लॉक ही चलाता है।

switch value {
case 1:
    print("One")
case 2:
    print("Two")
default:
    print("Other")
}

इस उदाहरण को देखिए:

if str == "apple" {
    print("Let's bake an apple crumble")
} else if str == "lemon" {
    print("Let's bake a lemon meringue pie!")
} else if str == "peach" {
    print("Let's bake a peach pie!")
} else {
    print("Let's buy ice cream.")
}

इसके बजाय इसे ऐसे लिखा जा सकता है:

switch str {
case "apple":
    print("Let's bake an apple crumble")
case "lemon":
    print("Let's bake a lemon meringue pie!")
case "peach":
    print("Let's bake a peach pie!")
default:
    print("Let's buy ice cream.")
}

while लूप

एक while लूप एक नियंत्रण प्रवाह स्टेटमेंट है, जिससे कोड तब तक चलाया जा सकता है जब तक कोई शर्त सही रहती है। Swift दो तरह के while लूप देता है: while लूप और repeat-while लूप। while लूप की शर्त का मूल्यांकन लूप के अंदर का कोड चलने से पहले होता है; अगर शर्त गलत है, तो लूप के अंदर का कोड बिल्कुल नहीं चलेगा। Swift में while लूप का ढाँचा इस तरह होता है:

while <#condition#> {
  <#code#>
}

यहाँ लूप तब तक चलेगा जब तक count 0 से बड़ा रहता है, और इस तरह वह संख्याएँ 2, 1 और "Liftoff!" छापेगा।

var count = 2
while count > 0 {
  print("\(count)…")
  count -= 1
}
print("Liftoff!")

// prints:
// 2…
// 1…
// Liftoff!

एक repeat-while लूप while लूप जैसा ही होता है, लेकिन इसमें शर्त का मूल्यांकन लूप के अंदर का कोड चलने के बाद होता है। इसका मतलब है कि लूप के अंदर का कोड हमेशा कम से कम एक बार चलेगा, भले ही शर्त गलत हो। Swift में repeat-while लूप का ढाँचा इस तरह होता है:

repeat {
  <#code#>
} while <#condition#>

यहाँ लूप सिर्फ एक बार चलेगा, क्योंकि शर्त गलत है। चूँकि यह repeat-while लूप है, शर्त का मूल्यांकन होने से पहले लूप के अंदर का कोड एक बार चल चुकेगा।

var count = 2
repeat {
  print("\(count)…")
} while count < 0
print("Liftoff!")

नियंत्रण हस्तांतरण

Swift में कुछ स्टेटमेंट हैं जिनसे लूप के सामान्य नियंत्रण प्रवाह को बदला जा सकता है। इन्हें नियंत्रण हस्तांतरण स्टेटमेंट कहा जाता है। आप return पहले ही देख चुके हैं; यह कॉन्सेप्ट कुछ और स्टेटमेंट से मिलवाएगा, जिनमें continue, break और लेबल शामिल हैं। इस कॉन्सेप्ट में हम fallthrough को नहीं समझाएँगे, लेकिन आप इसके बारे में Swift की किताब में पढ़ सकते हैं।

Continue

कभी-कभी लूप के मौजूदा इटरेशन के बाकी स्टेटमेंट पूरे किए बिना ही सीधे अगले इटरेशन पर पहुँचना ज़रूरी हो जाता है। इसके लिए continue कीवर्ड इस्तेमाल किया जा सकता है। जब continue चलाया जाता है, तो लूप सीधे अगली जाँच पर पहुँच जाता है ताकि देखा जा सके कि लूप का अगला इटरेशन चल सकता है या नहीं, यानी while और repeat-while लूप में while की जाँच, या for-in लूप में यह जाँच कि सीक्वेंस में कोई और एलिमेंट है या नहीं।

count = 1
while count < 6 {
  count += 1
  if count == 4 { continue }
  print(count)
}

// prints:
// 2
// 3
// 5

Break

break का इस्तेमाल लूप से जल्दी बाहर निकलने के लिए किया जाता है। जब break चलाया जाता है, तो लूप तुरंत खत्म हो जाता है और प्रोग्राम लूप के बाद वाले पहले स्टेटमेंट से आगे बढ़ जाता है।

for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
  if !fruit.count.isMultiple(of: 2) { break }
  print(fruit)
}

// prints:
// banana
// grapes

लेबल

जब लूप नेस्टेड होते हैं, तो कभी-कभी ऐसा होता है कि आप break या continue का इस्तेमाल करके उन बाहरी लूपों से बाहर निकलना या उन्हें फिर से शुरू करना चाहते हैं जिनके अंदर वह लूप है जिसमें break या continue इस्तेमाल किया गया है। ऐसे मामलों में लेबल का इस्तेमाल करके यह बताया जा सकता है कि किस लूप से बाहर निकलना है या किस लूप को फिर से शुरू करना है। किसी लूप को लेबल देने के लिए उस लूप को शुरू करने वाले while, repeat या for से पहले एक नाम और उसके बाद कोलन लगाया जाता है।

इस तरह लेबल इस्तेमाल करने का असर देखने के लिए इस लूप को देखिए:

outerLoop: for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
  print("\n--- \(fruit) ---")
  for letter in fruit {
    guard letter != "n" else { break outerLoop }
    print(letter)
  }
}

// prints:
// --- banana ---
// b
// a

निर्देश

आप एक निपुण मिक्सोलॉजिस्ट हैं और लोगों के बाहर घूमने की रातों के लिए स्वादिष्ट ड्रिंक बनाते हैं। लेकिन आपको लगा कि अपने काम में मदद के लिए थोड़ा-सा कोड लिखकर आप अपनी ज़िंदगी आसान बना सकते हैं।

1. पता कीजिए कि एक ऑर्डर बनाने में कितना समय लगता है

अलग-अलग ड्रिंक तैयार करने में अलग-अलग समय लगता है:

  • "beer", "soda" और "water" में से हर एक को बनाने में 0.5 मिनट लगते हैं।
  • "shot" बनाने में 1.0 मिनट लगते हैं, "mixed drink" बनाने में 1.5 मिनट लगते हैं,
  • "fancy drink" बनाने में 2.5 मिनट लगते हैं,
  • "frozen drink" बनाने में 3.0 मिनट लगते हैं।

timeToPrepare(drinks:) फंक्शन बनाइए। यह drinks आर्गुमेंट लेता है, जिसमें उन ड्रिंक के नाम वाली स्ट्रिंग का ऐरे होता है जिन्हें तैयार करना है। फंक्शन को ऐरे की सारी ड्रिंक तैयार करने में लगने वाला कुल समय लौटाना चाहिए।

timeToPrepare(drinks: ["beer", "frozen drink", "shot"])
// returns 4.5

2. नींबू की फाँकों का भंडार फिर से भरिए

अपनी शिफ्ट शुरू करते समय आपको सबसे पहले यह पक्का करना होता है कि आगे की शिफ्ट के लिए नींबू की फाँकों का आपका छोटा डिब्बा भरा हुआ है। अलग-अलग आकार के नींबू से अलग-अलग संख्या में फाँकें मिलती हैं। एक "small" नींबू से 6 फाँकें मिलती हैं, एक "medium" नींबू से 8 और एक "large" नींबू से 10।

जब तक आपको और फाँकें चाहिए और काटने के लिए और नींबू बचे हुए हैं, ऐरे से पहला नींबू निकालिए और जितनी फाँकें चाहिए उसमें से उस नींबू से मिलने वाली फाँकों की संख्या घटा दीजिए। ऐसा तब तक करते रहिए जब तक और फाँकें न चाहिए हों या नींबू खत्म न हो जाएँ।

makeWedges(needed:limes:) फंक्शन बनाइए। यह दो आर्गुमेंट लेता है: needed, जिसमें काटने के लिए ज़रूरी फाँकों की संख्या होती है, और limes, जिसमें आपके पास काटने के लिए मौजूद नींबुओं के आकार वाली स्ट्रिंग का ऐरे होता है। फंक्शन को आपके काटे गए नींबुओं की संख्या लौटानी चाहिए।

makeWedges(needed: 25, limes: ["small", "small", "large", "medium", "small"])
// returns 4

3. अपनी शिफ्ट पूरी कीजिए

बधाई हो! आपका लंबा काम का दिन लगभग खत्म होने वाला है और आप जल्द ही अपने नए ऐप पर काम करने घर जाएँगे। लेकिन अगली शिफ्ट को ऑर्डर सौंपकर निकलने से पहले आपको अभी बहुत सारे ड्रिंक के ऑर्डर बनाने हैं।

जब तक आपकी शिफ्ट में समय बचा है, आपको ऐरे का पहला ऑर्डर बनाना है और फिर उस ऑर्डर को ऐरे से हटा देना है। इसके बाद आप अपने timeToPrepare(drinks:) फंक्शन के हिसाब से उस ऑर्डर को बनाने में लगा समय अपनी शिफ्ट के बचे समय में से घटा सकते हैं।

finishShift(minutesLeft:remainingOrders:) फंक्शन बनाइए, जो आपकी शिफ्ट में बचे मिनटों की संख्या (जो 0 से अधिक होना तय है) और ड्रिंक के ऑर्डरों का एक ऐसा ऐरे लेता है जो खाली नहीं होगा। फंक्शन को उन ऑर्डरों का ऐरे लौटाना चाहिए जिन तक आप अपनी शिफ्ट खत्म होने से पहले नहीं पहुँच पाए।

finishShift(minutesLeft: 5, remainingOrders: [["beer", "frozen drink", "shot"], ["fancy drink", "soda"], ["beer", "beer", "water"], ["mixed drink", "frozen drink"]])
// returns [["beer", "beer", "water"], ["mixed drink", "frozen drink"]]

4. कुछ खास ऑर्डरों पर नज़र रखिए

यह पक्का करने के लिए कि beer और soda ताज़ा रहें, आपको उनके ऑर्डरों पर और उन ऑर्डरों के दिए जाने के समय पर भी नज़र रखनी होगी।

orderTracker(orders: [(drink: String, time: String)]) -> (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?) फंक्शन बनाइए। जब इसे ऑर्डरों और समयों की सूची दी जाती है, तो यह ऑप्शनल ट्यूपल का एक जोड़ा लौटाता है, जिसमें beer और soda के पहले और अंतिम ऑर्डर के समय और हर एक के कुल ऑर्डरों की संख्या होती है। अगर उन पेयों का कोई ऑर्डर नहीं हुआ हो, तो यह nil लौटाता है। आपको किसी और ड्रिंक पर नज़र रखने की ज़रूरत नहीं है।

orderTracker(orders:) फंक्शन बनाइए, जो ट्यूपल का ऐरे लेता है। हर ट्यूपल में ऑर्डर किया गया ड्रिंक और ऑर्डर देने का समय होता है। फंक्शन को एक ऐसा ट्यूपल लौटाना चाहिए जिसमें beer का पहला और अंतिम ऑर्डर समय, beer के कुल ऑर्डरों की संख्या, soda का पहला और अंतिम ऑर्डर समय, और soda के कुल ऑर्डरों की संख्या हो। इसे इस फॉर्मैट के ट्यूपल के रूप में लौटाया जाना चाहिए: (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?).

let orders = [
    (drink: "beer", time: "10:01"), (drink: "frozen drink", time: "10:02"),
    (drink: "shot", time: "10:05"), (drink: "fancy drink", time: "10:06"),
    (drink: "soda", time: "10:09"), (drink: "beer", time: "10:15"), (drink: "beer", time: "10:22"),
    (drink: "water", time: "10:26"), (drink: "mixed drink", time: "10:28"),
    (drink: "frozen drink", time: "10:33"),
]

orderTracker(orders: orders)

// returns (beer: (first "10:01", last "10:22", total 3), soda: (first "10:09", last "10:09", total 1))
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Swift Exercism

विशेषज्ञ मिक्सोलॉजिस्ट शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Swift को 35 कॉन्सेप्ट116 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।