Opaque Type Swift की एक तंत्र है जो फ़ंक्शन को कॉल करने वाले कोड से ठोस प्रकार बताए बिना किसी प्रकार का मान लौटाने की अनुमति देता है। रिटर्न टाइप में some कीवर्ड सबसे प्रसिद्ध उदाहरण है: SwiftUI में some View का अर्थ है “फ़ंक्शन View को अनुरूप कोई प्रकार लौटाता है, लेकिन वास्तव में कौन सा — यह कार्यान्वयन का विवरण है।” Opaque type प्रकार की पहचान बनाए रखता है (एक प्रकार के रूप में प्रोटोकॉल के विपरीत), जो कंपाइलर को कोड को अनुकूलित करने की अनुमति देता है और लौटाए गए प्रकार की स्थिरता सुनिश्चित करता है। Swift Book, 2025 के अनुसार, opaque types संबद्ध प्रकारों वाले प्रोटोकॉल की समस्या को हल करते हैं, जिससे फ़ंक्शन से ऐसे प्रोटोकॉल के मान लौटाए जा सकते हैं।
मुख्य बातें
Opaque Type एक रिटर्न प्रकार है जिसे some कीवर्ड के साथ घोषित किया जाता है और जो कॉल करने वाले कोड से ठोस कार्यान्वयन छिपाता है। कॉल करने वाला केवल इतना जानता है कि लौटाया गया मान किसी निश्चित प्रोटोकॉल का अनुपालन करता है, लेकिन यह नहीं जानता कि some के पीछे वास्तव में कौन सा प्रकार है। इस बीच, कंपाइलर सटीक प्रकार जानता है और स्टैटिक डिस्पैच और ऑप्टिमाइज़ेशन के लिए इसका उपयोग करता है।
Swift 5.1 (SE-0244) में opaque types के आने से पहले, बॉक्सिंग रैपर के बिना फ़ंक्शन से संबद्ध प्रकारों वाले प्रोटोकॉल को लौटाना असंभव था। उदाहरण के लिए, Equatable प्रोटोकॉल का एक संबद्ध प्रकार है, और फ़ंक्शन केवल Equatable नहीं लौटा सकता था — कंपाइलर त्रुटि देता था “प्रोटोकॉल का उपयोग केवल सामान्य बाधा के रूप में किया जा सकता है।” Opaque type ने इस समस्या को हल किया।
func makeInt() -> some Equatable {
return 42
}
func makeString() -> some Equatable {
return "Hello"
}
// कंपाइलर जानता है कि makeInt Int लौटाता है
// makeInt() == makeString() — ❌ त्रुटि, विभिन्न प्रकार
दोनों फ़ंक्शन some Equatable लौटाते हैं, लेकिन ठोस प्रकार अलग हैं: Int और String। उनकी == से तुलना करने का प्रयास संकलन त्रुटि का कारण बनेगा क्योंकि opaque type गारंटी देता है कि एक विशिष्ट कॉल एक ही प्रकार लौटाता है, लेकिन विभिन्न फ़ंक्शनों में नहीं। यह एक विशेषता है, बग नहीं: opaque type प्रकार की पहचान को वहाँ संरक्षित करता है जहाँ एक प्रकार के रूप में प्रोटोकॉल (any Equatable) इसे खो देता है।
Generic और Opaque Type एक ही सिक्के के दो पहलू हैं। जेनेरिक कॉल करने वाले कोड को प्रकार चुनने की अनुमति देते हैं, जबकि opaque type फ़ंक्शन को कॉल करने वाले कोड से प्रकार छिपाने की अनुमति देता है। अंतर नियंत्रण की दिशा में है।
| विशेषता | Generic | Opaque some |
|---|---|---|
| प्रकार कौन चुनता है | कॉल करने वाला कोड | फ़ंक्शन/विधि |
| प्रकार की पहचान | संरक्षित (स्थिर) | संरक्षित (स्थिर) |
| रिटर्न शाखाओं की संख्या | एक (जेनेरिक के माध्यम से) | सभी शाखाओं में एक ही प्रकार |
| उपयोग | एल्गोरिदम, डेटा संरचनाएँ | SwiftUI, फ़ैक्टरी विधियाँ |
जेनेरिक फ़ंक्शन में, कॉलर तय करता है कि किस प्रकार का उपयोग करना है। फ़ंक्शन को किसी भी T के साथ काम करना चाहिए जो बाधाओं को संतुष्ट करता है। Opaque type के लिए, कॉलर ठोस प्रकार नहीं जानता — कार्यान्वयन निर्णय लेता है।
// Generic: कॉलर प्रकार चुनता है
func identity<T>(_ value: T) -> T { value }
let x: Int = identity(42)
// Opaque: फ़ंक्शन प्रकार छिपाता है
func makeSomeEquatable() -> some Equatable { 42 }
let y = makeSomeEquatable()
जेनेरिक और opaque type के बीच चुनाव आशय पर निर्भर करता है। यदि कॉल करने वाले कोड को प्रकार चुनना चाहिए, तो जेनेरिक का उपयोग करें। यदि फ़ंक्शन को कार्यान्वयन विवरण छिपाने चाहिए, तो some का उपयोग करें। SwiftUI ने some View को इसलिए चुना क्योंकि body आंतरिक रूप से लचीला लेकिन बाहरी रूप से स्थिर होना चाहिए।
some Swift 5.1 (SE-0244) में पेश किया गया Swift कीवर्ड है। इसका उपयोग रिटर्न स्थिति में opaque type घोषित करने के लिए किया जाता है, साथ ही पैरामीटर (SE-0341) और गुणों में भी। some गारंटी देता है कि ठोस प्रकार स्थिर है और कंपाइलर को ज्ञात है लेकिन बाहरी कोड से छिपा हुआ है।
Swift 5.7 से, some का उपयोग न केवल रिटर्न स्थिति में बल्कि पैरामीटर में भी किया जा सकता है। पैरामीटर में some Equatable का अर्थ है “यह फ़ंक्शन किसी भी Equatable प्रकार को स्वीकार करता है, लेकिन एक विशिष्ट निकाय के अंदर सभी कॉल एक ही प्रकार देखते हैं।”
func areEqual(_ a: some Equatable, _ b: some Equatable) -> Bool {
// a और b — संभावित रूप से विभिन्न प्रकार, == सीधे काम नहीं करेगा
return isEqual(a, b)
}
func isEqual<T: Equatable>(_ a: T, _ b: T) -> Bool {
return a == b
}
पैरामीटर में some का उपयोग
any Swift 5.6+ का कीवर्ड है जो एक्ज़िस्टेंशियल प्रकारों (एक प्रकार के रूप में प्रोटोकॉल) को स्पष्ट रूप से घोषित करने के लिए है। some के विपरीत, any प्रकार की पहचान मिटा देता है: कंपाइलर नहीं जानता कि प्रोटोकॉल के पीछे कौन सा ठोस प्रकार छिपा है। यह लचीलापन प्रदान करता है (आप एक ही सरणी में विभिन्न प्रकार संग्रहीत कर सकते हैं), लेकिन प्रदर्शन की कीमत पर।
some — स्थैतिक बहुरूपता: कंपाइलर ठोस प्रकार जानता है, प्रत्यक्ष डिस्पैच का उपयोग करता है और कोड को इनलाइन कर सकता है। any — गतिशील बहुरूपता: वर्चुअल विधि तालिका (एक्ज़िस्टेंशियल कंटेनर) का उपयोग किया जाता है, जो अप्रत्यक्षता जोड़ता है।
protocol Drawable {
func draw()
}
// some: स्थैतिक प्रकार ज्ञात है
func makeDrawable() -> some Drawable {
return Circle() // एकल रिटर्न प्रकार
}
// any: गतिशील, विभिन्न प्रकार संग्रहीत कर सकता है
var shapes: [any Drawable] = [Circle(), Square()]
shapes.append(Triangle())
some और any के बीच चुनाव प्रदर्शन और लचीलेपन के बीच समझौता है। Some तेज़ है लेकिन एक कार्यान्वयन तक सीमित है। Any अधिक लचीला है (आप प्रकार मिश्रित कर सकते हैं) लेकिन गतिशील डिस्पैच के कारण धीमा है। SwiftUI में, body हमेशा some View का उपयोग करता है क्योंकि प्रत्येक View का body एक ठोस प्रकार होता है।
Opaque Type Swift की एक मूलभूत समस्या को हल करता है: संबद्ध प्रकारों वाले प्रोटोकॉल (PAT) को सीधे एक प्रकार के रूप में उपयोग नहीं किया जा सकता है। एक फ़ंक्शन केवल Collection नहीं लौटा सकता — कंपाइलर को Element निर्दिष्ट करने की आवश्यकता होती है। some Collection संबद्ध प्रकार छिपाकर इसे हल करता है।
Opaque type के बिना, Collection लौटाने के लिए ठोस प्रकार (Array
func makeReversedCollection<T>(
of array: [T]
) -> some Collection {
return array.reversed()
}
let result = makeReversedCollection(of: [1, 2, 3])
// result — ReversedCollection>, hidden from caller
for item in result {
print(item)
}
result पर पुनरावृति की जा सकती है, लेकिन आप ReversedCollection के गुणों तक सीधे पहुँच नहीं सकते। यह एनकैप्सुलेशन की रक्षा करता है: यदि आप बाद में reversed() को किसी भिन्न कार्यान्वयन वाली दूसरी विधि से बदलते हैं, तो कॉल करने वाला कोड नहीं टूटेगा। Opaque type आपको API बदले बिना कार्यान्वयन बदलने की स्वतंत्रता देता है।
some View opaque type का सबसे प्रसिद्ध उपयोग है। SwiftUI में प्रत्येक View body को some View के रूप में घोषित करता है। इसका अर्थ है कि body किसी ठोस प्रकार का View लौटाता है, लेकिन डेवलपर को यह सोचने की आवश्यकता नहीं है कि वास्तव में क्या है — TupleView, Group, ModifiedContent या फ्रेमवर्क का कोई अन्य प्रकार।
Opaque type के बिना, body को एक ठोस प्रकार लौटाना होता, उदाहरण के लिए, ModifiedContent<Button<Text>, Padding>, जो अव्यावहारिक है। some View इस जटिलता को छिपाता है। कंपाइलर संकलन के समय स्वचालित रूप से body के सटीक प्रकार का अनुमान लगाता है।
struct ContentView: View {
var body: some View {
VStack {
Text("नमस्ते")
.font(.title)
Button("मुझे टैप करें") {
print("टैप किया गया")
}
}
.padding()
}
}
कंपाइलर body को ModifiedContent<VStack<TupleView<(Text, Button<Text>)>>, Padding> के रूप में अनुमानित करता है। डेवलपर some View देखता है। यदि आप लेआउट को VStack से HStack में बदलते हैं, तो कंपाइलर स्वचालित रूप से प्रकार का पुनः अनुमान लगाएगा — कोई मैन्युअल संपादन आवश्यक नहीं है। यह opaque type का जादू है: डेवलपर इंटरफ़ेस तर्क पर ध्यान केंद्रित करता है, संरचना प्रकारों पर नहीं।
अक्सर पूछे जाने वाले प्रश्न
Opaque Type एक प्रकार है जिसे some कीवर्ड के साथ घोषित किया जाता है और जो कॉल करने वाले कोड से ठोस कार्यान्वयन छिपाता है। कंपाइलर सटीक प्रकार जानता है, लेकिन फ़ंक्शन का उपयोग करने वाला डेवलपर केवल प्रोटोकॉल देखता है।
some स्थैतिक पहचान वाला opaque type है: कंपाइलर ठोस प्रकार जानता है। any गतिशील डिस्पैच वाला एक्ज़िस्टेंशियल प्रकार है: प्रकार की पहचान मिट जाती है। Some अधिक कुशल है, any अधिक लचीला है।
some View body के जटिल ठोस प्रकार को छिपाता है, जिसे कंपाइलर स्वचालित रूप से अनुमानित करता है। यह डेवलपर को सामान्य रैपर (VStack, Group, ModifiedContent) से बने सटीक प्रकार लिखने से मुक्त करता है।
हाँ, Swift 5.7 से। पैरामीटर में some, जेनेरिक पैरामीटर पर सिंटैक्टिक शुगर है। यह फ़ंक्शन घोषणाओं को सरल बनाता है, विशेषकर प्रोटोकॉल के साथ काम करते समय जहाँ प्रत्येक some-पैरामीटर को अलग
कंपाइलर त्रुटि देगा: opaque type आवश्यकता है कि सभी रिटर्न शाखाएँ एक ही ठोस प्रकार लौटाएँ। यह प्रकार की पहचान बनाए रखने के लिए जानबूझकर किया गया है। यदि आपको विभिन्न प्रकार लौटाने की आवश्यकता है, तो any का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें