Opaque Type: यह क्या है, Swift में some और any

लेखक: IT Sectr प्रकाशित: 2026-06-18 पढ़ने का समय: 11 मिनट

Opaque Type Swift की एक तंत्र है जो फ़ंक्शन को कॉल करने वाले कोड से ठोस प्रकार बताए बिना किसी प्रकार का मान लौटाने की अनुमति देता है। रिटर्न टाइप में some कीवर्ड सबसे प्रसिद्ध उदाहरण है: SwiftUI में some View का अर्थ है “फ़ंक्शन View को अनुरूप कोई प्रकार लौटाता है, लेकिन वास्तव में कौन सा — यह कार्यान्वयन का विवरण है।” Opaque type प्रकार की पहचान बनाए रखता है (एक प्रकार के रूप में प्रोटोकॉल के विपरीत), जो कंपाइलर को कोड को अनुकूलित करने की अनुमति देता है और लौटाए गए प्रकार की स्थिरता सुनिश्चित करता है। Swift Book, 2025 के अनुसार, opaque types संबद्ध प्रकारों वाले प्रोटोकॉल की समस्या को हल करते हैं, जिससे फ़ंक्शन से ऐसे प्रोटोकॉल के मान लौटाए जा सकते हैं।

मुख्य बातें

  • Opaque Type — एक रिटर्न प्रकार जो कॉल करने वाले कोड से ठोस कार्यान्वयन छिपाता है
  • some — रिटर्न स्थिति में opaque type घोषित करने के लिए कीवर्ड
  • प्रकार की पहचान संरक्षित रहती है: कंपाइलर ठोस प्रकार जानता है, any के विपरीत
  • SwiftUI body घोषित करने के मानक तरीके के रूप में some View का उपयोग करता है
  • सीमा: some वाले फ़ंक्शन को सभी शाखाओं से एक ही ठोस प्रकार लौटाना होगा

Swift में Opaque Type क्या है?

Opaque Type एक रिटर्न प्रकार है जिसे some कीवर्ड के साथ घोषित किया जाता है और जो कॉल करने वाले कोड से ठोस कार्यान्वयन छिपाता है। कॉल करने वाला केवल इतना जानता है कि लौटाया गया मान किसी निश्चित प्रोटोकॉल का अनुपालन करता है, लेकिन यह नहीं जानता कि some के पीछे वास्तव में कौन सा प्रकार है। इस बीच, कंपाइलर सटीक प्रकार जानता है और स्टैटिक डिस्पैच और ऑप्टिमाइज़ेशन के लिए इसका उपयोग करता है।

Opaque Type किस समस्या को हल करता है

Swift 5.1 (SE-0244) में opaque types के आने से पहले, बॉक्सिंग रैपर के बिना फ़ंक्शन से संबद्ध प्रकारों वाले प्रोटोकॉल को लौटाना असंभव था। उदाहरण के लिए, Equatable प्रोटोकॉल का एक संबद्ध प्रकार है, और फ़ंक्शन केवल Equatable नहीं लौटा सकता था — कंपाइलर त्रुटि देता था “प्रोटोकॉल का उपयोग केवल सामान्य बाधा के रूप में किया जा सकता है।” Opaque type ने इस समस्या को हल किया।

swift
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) इसे खो देता है।

Opaque Type vs Generic: क्या अंतर है

Generic और Opaque Type एक ही सिक्के के दो पहलू हैं। जेनेरिक कॉल करने वाले कोड को प्रकार चुनने की अनुमति देते हैं, जबकि opaque type फ़ंक्शन को कॉल करने वाले कोड से प्रकार छिपाने की अनुमति देता है। अंतर नियंत्रण की दिशा में है।

विशेषताGeneric Opaque some
प्रकार कौन चुनता हैकॉल करने वाला कोडफ़ंक्शन/विधि
प्रकार की पहचानसंरक्षित (स्थिर)संरक्षित (स्थिर)
रिटर्न शाखाओं की संख्याएक (जेनेरिक के माध्यम से)सभी शाखाओं में एक ही प्रकार
उपयोगएल्गोरिदम, डेटा संरचनाएँSwiftUI, फ़ैक्टरी विधियाँ

Generic — बाहर से चुनाव

जेनेरिक फ़ंक्शन में, कॉलर तय करता है कि किस प्रकार का उपयोग करना है। फ़ंक्शन को किसी भी T के साथ काम करना चाहिए जो बाधाओं को संतुष्ट करता है। Opaque type के लिए, कॉलर ठोस प्रकार नहीं जानता — कार्यान्वयन निर्णय लेता है।

swift
// 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 कीवर्ड और इसका उपयोग

some Swift 5.1 (SE-0244) में पेश किया गया Swift कीवर्ड है। इसका उपयोग रिटर्न स्थिति में opaque type घोषित करने के लिए किया जाता है, साथ ही पैरामीटर (SE-0341) और गुणों में भी। some गारंटी देता है कि ठोस प्रकार स्थिर है और कंपाइलर को ज्ञात है लेकिन बाहरी कोड से छिपा हुआ है।

फ़ंक्शन पैरामीटर में some

Swift 5.7 से, some का उपयोग न केवल रिटर्न स्थिति में बल्कि पैरामीटर में भी किया जा सकता है। पैरामीटर में some Equatable का अर्थ है “यह फ़ंक्शन किसी भी Equatable प्रकार को स्वीकार करता है, लेकिन एक विशिष्ट निकाय के अंदर सभी कॉल एक ही प्रकार देखते हैं।”

swift
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 का उपयोग की तुलना में अधिक संक्षिप्त सिंटैक्स प्रदान करता है। यह विशेष रूप से प्रोटोकॉल और प्रोटोकॉल-उन्मुख डिज़ाइन में उपयोगी है, जहाँ प्रोटोकॉल के प्रत्येक उपयोग के लिए अलग जेनेरिक पैरामीटर की आवश्यकता नहीं होती है। कंपाइलर आंतरिक रूप से some-पैरामीटर को जेनेरिक में बदल देता है, इसलिए प्रदर्शन समान है।

any कीवर्ड और एक्ज़िस्टेंशियल प्रकार

any Swift 5.6+ का कीवर्ड है जो एक्ज़िस्टेंशियल प्रकारों (एक प्रकार के रूप में प्रोटोकॉल) को स्पष्ट रूप से घोषित करने के लिए है। some के विपरीत, any प्रकार की पहचान मिटा देता है: कंपाइलर नहीं जानता कि प्रोटोकॉल के पीछे कौन सा ठोस प्रकार छिपा है। यह लचीलापन प्रदान करता है (आप एक ही सरणी में विभिन्न प्रकार संग्रहीत कर सकते हैं), लेकिन प्रदर्शन की कीमत पर।

some vs any: तुलनात्मक विश्लेषण

some — स्थैतिक बहुरूपता: कंपाइलर ठोस प्रकार जानता है, प्रत्यक्ष डिस्पैच का उपयोग करता है और कोड को इनलाइन कर सकता है। any — गतिशील बहुरूपता: वर्चुअल विधि तालिका (एक्ज़िस्टेंशियल कंटेनर) का उपयोग किया जाता है, जो अप्रत्यक्षता जोड़ता है।

swift
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

Opaque Type Swift की एक मूलभूत समस्या को हल करता है: संबद्ध प्रकारों वाले प्रोटोकॉल (PAT) को सीधे एक प्रकार के रूप में उपयोग नहीं किया जा सकता है। एक फ़ंक्शन केवल Collection नहीं लौटा सकता — कंपाइलर को Element निर्दिष्ट करने की आवश्यकता होती है। some Collection संबद्ध प्रकार छिपाकर इसे हल करता है।

PAT को some के माध्यम से लौटाना

Opaque type के बिना, Collection लौटाने के लिए ठोस प्रकार (Array) या प्रकार विलोपन (AnyCollection) का उपयोग करना होता। some Collection एक मध्य मार्ग प्रदान करता है: कंपाइलर ठोस कार्यान्वयन जानता है, कॉल करने वाला कोड नहीं जानता।

swift
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 बदले बिना कार्यान्वयन बदलने की स्वतंत्रता देता है।

SwiftUI में some View के व्यावहारिक उदाहरण

some View opaque type का सबसे प्रसिद्ध उपयोग है। SwiftUI में प्रत्येक View body को some View के रूप में घोषित करता है। इसका अर्थ है कि body किसी ठोस प्रकार का View लौटाता है, लेकिन डेवलपर को यह सोचने की आवश्यकता नहीं है कि वास्तव में क्या है — TupleView, Group, ModifiedContent या फ्रेमवर्क का कोई अन्य प्रकार।

SwiftUI कैसे some View का उपयोग करता है

Opaque type के बिना, body को एक ठोस प्रकार लौटाना होता, उदाहरण के लिए, ModifiedContent<Button<Text>, Padding>, जो अव्यावहारिक है। some View इस जटिलता को छिपाता है। कंपाइलर संकलन के समय स्वचालित रूप से body के सटीक प्रकार का अनुमान लगाता है।

swift
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 का जादू है: डेवलपर इंटरफ़ेस तर्क पर ध्यान केंद्रित करता है, संरचना प्रकारों पर नहीं।

अक्सर पूछे जाने वाले प्रश्न

Swift में Opaque Type क्या है?

Opaque Type एक प्रकार है जिसे some कीवर्ड के साथ घोषित किया जाता है और जो कॉल करने वाले कोड से ठोस कार्यान्वयन छिपाता है। कंपाइलर सटीक प्रकार जानता है, लेकिन फ़ंक्शन का उपयोग करने वाला डेवलपर केवल प्रोटोकॉल देखता है।

Swift में some, any से कैसे अलग है?

some स्थैतिक पहचान वाला opaque type है: कंपाइलर ठोस प्रकार जानता है। any गतिशील डिस्पैच वाला एक्ज़िस्टेंशियल प्रकार है: प्रकार की पहचान मिट जाती है। Some अधिक कुशल है, any अधिक लचीला है।

SwiftUI some View का उपयोग क्यों करता है?

some View body के जटिल ठोस प्रकार को छिपाता है, जिसे कंपाइलर स्वचालित रूप से अनुमानित करता है। यह डेवलपर को सामान्य रैपर (VStack, Group, ModifiedContent) से बने सटीक प्रकार लिखने से मुक्त करता है।

क्या फ़ंक्शन पैरामीटर में some का उपयोग किया जा सकता है?

हाँ, Swift 5.7 से। पैरामीटर में some, जेनेरिक पैरामीटर पर सिंटैक्टिक शुगर है। यह फ़ंक्शन घोषणाओं को सरल बनाता है, विशेषकर प्रोटोकॉल के साथ काम करते समय जहाँ प्रत्येक some-पैरामीटर को अलग की आवश्यकता नहीं होती।

यदि some-फ़ंक्शन से विभिन्न प्रकार लौटाए जाएँ तो क्या होगा?

कंपाइलर त्रुटि देगा: opaque type आवश्यकता है कि सभी रिटर्न शाखाएँ एक ही ठोस प्रकार लौटाएँ। यह प्रकार की पहचान बनाए रखने के लिए जानबूझकर किया गया है। यदि आपको विभिन्न प्रकार लौटाने की आवश्यकता है, तो any का उपयोग करें।

सारांश

  • Opaque Type — कंपाइलर स्तर पर इसकी पहचान बनाए रखते हुए रिटर्न मान के ठोस प्रकार को छिपाता है
  • some कीवर्ड का उपयोग रिटर्न स्थिति और पैरामीटर में opaque type घोषित करने के लिए किया जाता है
  • Generic vs Opaque: कॉलर जेनेरिक के लिए प्रकार चुनता है, कार्यान्वयन opaque के लिए चुनता है
  • any — गतिशील डिस्पैच वाला एक्ज़िस्टेंशियल प्रकार, some — स्थैतिक बहुरूपता
  • SwiftUI some View — मुख्य उपयोग मामला: डेवलपर से body के जटिल प्रकार को छिपाता है
  • Opaque type फ़ंक्शन से संबद्ध प्रकारों वाले प्रोटोकॉल (PAT) लौटाने की समस्या हल करता है

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें