Associated Values — एक Swift तंत्र जो प्रत्येक enum केस में अलग-अलग डेटा संलग्न करने की अनुमति देता है। raw values के विपरीत, जहाँ सभी केसों में समान प्रकार के मान होते हैं, associated values प्रत्येक केस के लिए प्रकार और मात्रा में भिन्न हो सकते हैं। Apple Documentation, 2026 के अनुसार, अतिरिक्त रैपर प्रकार बनाए बिना डोमेन को सटीक रूप से मॉडल करने के लिए यह एक महत्वपूर्ण क्षमता है।
मुख्य बातें
Associated Values अतिरिक्त जानकारी है जो एक enum केस अपने साथ संग्रहीत कर सकता है। raw values के विपरीत, जो घोषणा स्तर पर निश्चित होते हैं, associated values enum इंस्टेंस बनाते समय सेट किए जाते हैं।
एक भुगतान विधि मॉडल करने की कल्पना करें: creditCard केस अंतिम 4 अंक और समाप्ति तिथि संग्रहीत कर सकता है, जबकि applePay केस कुछ भी संग्रहीत नहीं करता। associated values के साथ, यह उपवर्गों या वैकल्पिक फ़ील्ड के बिना, स्वाभाविक रूप से कार्यान्वित होता है।
Apple दस्तावेज़ीकरण के अनुसार, associated values enum को स्थिरांकों के एक साधारण सेट से एक बीजगणितीय डेटा प्रकार (sum type) में बदल देते हैं, जो कार्यात्मक भाषाओं की विशेषता है। यह कोड अभिव्यक्ति को महत्वपूर्ण रूप से बढ़ाता है।
Associated Values को केस के बाद कोष्ठक में घोषित किया जाता है, जिसमें पैरामीटर नाम और प्रकार निर्दिष्ट होते हैं, जैसे फ़ंक्शन में।
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
इंस्टेंस बनाते समय, associated values को तर्क के रूप में पास किया जाता है:
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swift associated values की संख्या या प्रकारों पर प्रतिबंध नहीं लगाता। आप associated values के अंदर जेनेरिक, क्लोजर फ़ंक्शन और अन्य enum का उपयोग कर सकते हैं। यह जटिल नेस्टेड संरचनाओं के निर्माण को संभव बनाता है।
associated values के पैरामीटर नाम इंस्टेंस बनाते समय तर्क लेबल के रूप में उपयोग किए जाते हैं — यह कोड पठनीयता में सुधार करता है। switch के माध्यम से निष्कर्षण करते समय, नाम दस्तावेज़ीकरण के रूप में कार्य करते हैं, प्रत्येक मान का अर्थ स्पष्ट करते हैं। यह दृष्टिकोण कोड को स्व-दस्तावेज़ीकरण बनाता है और डेटा मिलान करते समय त्रुटियों की संभावना को कम करता है। यह बड़े iOS अनुप्रयोगों के टीम विकास में विशेष रूप से मूल्यवान है।
Switch associated values निकालने का प्राथमिक तरीका है। मान let या var के माध्यम से स्थिरांक या चर से बंधे होते हैं।
func describe(_ file: MediaFile) -> String {
switch file {
case .image(let w, let h, let fmt):
return "Image \(w)x\(h) .\(fmt)"
case .video(let duration, let codec):
return "Video \(duration)s, \(codec)"
case .audio(let bitrate):
return "Audio \(bitrate)kbps"
case .unknown:
return "Unknown format"
}
}
Swift आंशिक मिलान का समर्थन करता है — आप associated values के लिए विशिष्ट मान निर्दिष्ट कर सकते हैं:
switch file {
case .image(let w, let h, "png"):
print("PNG छवि \(w)x\(h)")
case .image(1920, 1080, _):
print("Full HD छवि")
default:
break
}
वाइल्डकार्ड (_) का उपयोग अनावश्यक associated values को अनदेखा करने की अनुमति देता है, और केस में स्थिरांक आपको विशिष्ट मानों के साथ मिलान की जांच करने देते हैं।
कई शुरुआती डेवलपर associated values को raw values के साथ भ्रमित करते हैं। ये अलग-अलग उपयोग मामलों वाले विभिन्न तंत्र हैं।
| विशेषता | Raw Values | Associated Values |
|---|---|---|
| डेटा प्रकार | सभी केसों के लिए एक प्रकार | प्रत्येक केस के लिए अलग-अलग प्रकार |
| असाइनमेंट समय | enum घोषणा पर | इंस्टेंस निर्माण पर |
| अनिवार्यता | सभी केसों का एक मान होता है | कुछ केसों के बिना मान हो सकते हैं |
| संगतता | परस्पर अपवर्जी — एक साथ उपयोग नहीं किया जा सकता | |
Swift Evolution के अनुसार, associated values को Swift 2.0 में enum रीडिज़ाइन के भाग के रूप में पेश किया गया था। वे प्रकारों के लिए बीजगणितीय दृष्टिकोण प्रदान करते हैं, जहाँ प्रत्येक केस अपने स्वयं के हस्ताक्षर के साथ एक अलग कंस्ट्रक्टर है।
Associated Values वास्तविक iOS परियोजनाओं में सक्रिय रूप से उपयोग किए जाते हैं। आइए तीन विशिष्ट परिदृश्यों पर विचार करें।
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
associated values के साथ, enum राज्य मशीनों के लिए एक शक्तिशाली उपकरण बन जाता है: प्रत्येक केस एक स्थिति है, associated values उस स्थिति के पैरामीटर हैं। कंपाइलर गारंटी देता है कि सभी संक्रमण संभाले गए हैं।
switch के बिना एकल केस की जांच करने के लिए, if case या guard case का उपयोग करें। जब आपको केवल एक विकल्प संभालने की आवश्यकता हो तो यह अधिक संक्षिप्त है।
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("\(seconds)s के बाद अनुरोध समय समाप्त")
}
guard case .httpError(let code, _) = error else {
return
}
print("\(code) कोड के साथ HTTP त्रुटि")
अक्सर पूछे जाने वाले प्रश्न
हाँ, एक केस में associated values नहीं हो सकते — उदाहरण के लिए, case unknown. ऐसे केस बिना अतिरिक्त डेटा के सामान्य enum केस की तरह व्यवहार करते हैं। यह मार्कर स्थितियों के लिए सुविधाजनक है।
Swift associated values वाले enum के लिए स्वचालित रूप से Equatable उत्पन्न नहीं करता (Swift 4.2+ से पहले)। स्पष्ट Equatable कार्यान्वयन जोड़ें या प्रत्येक केस की क्रमिक रूप से तुलना करने के लिए switch का उपयोग करें।
हाँ, indirect enum में associated values पेड़ और लिंक्ड सूचियाँ बनाने की एक मानक तकनीक है। एक केस में indirect चिह्नित उसी प्रकार का associated value हो सकता है।
Associated Values टाइप-सेफ हैं — प्रत्येक केस की गारंटी है कि उसके पास केवल अपना डेटा है। वैकल्पिक वाले struct में, प्रत्येक इंस्टेंस में सभी फ़ील्ड होते हैं, और रनटाइम nil जाँच की आवश्यकता होती है।
Swift associated values वाले enum के लिए स्वचालित रूप से Codable उत्पन्न नहीं करता। कस्टम कोडिंग कुंजियों का उपयोग करके केसों पर switch के माध्यम से encode और decode का मैन्युअल कार्यान्वयन आवश्यक है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें