Struct Swift भाषा में एक वैल्यू टाइप (value type) है, जिसके इंस्टेंस कोड के विभिन्न भागों के बीच पास करते समय कॉपी किए जाते हैं। क्लासेस के विपरीत, संरचनाएँ इनहेरिटेंस का समर्थन नहीं करतीं, लेकिन वे प्रोटोकॉल लागू करती हैं, प्रॉपर्टी और मेथड रखती हैं, और ARC के बिना पूर्वानुमानित मेमोरी प्रबंधन प्रदान करती हैं। Swift Programming Language Guide, 2026 के अनुसार, struct Swift का मूलभूत निर्माण खंड है — यहाँ तक कि मानक प्रकार Int, String, Array और Dictionary भी संरचनाओं के रूप में लागू किए गए हैं। भाषा डेटा मॉडलिंग के लिए संरचनाओं को प्राथमिकता विकल्प के रूप में सुझाती है।
मुख्य बिंदु
Struct (संरचना) Swift में एक समग्र डेटा प्रकार है जो संबंधित गुणों और विधियों को एक इकाई में समूहित करता है। क्लासेस के विपरीत, संरचनाएँ value types हैं: किसी फंक्शन में पास करने या नए वेरिएबल में असाइन करने पर, मूल वस्तु के संदर्भ के बजाय संरचना की एक स्वतंत्र प्रतिलिपि बनाई जाती है।
Swift सभी आदिम प्रकारों के लिए संरचनाओं का उपयोग करता है: Int, Double, String, Bool, Array, Dictionary और Set। इसका मतलब है कि एक मूल Int भी संरचना की तरह व्यवहार करता है — असाइनमेंट पर एक प्रतिलिपि बनती है। डेवलपर अपनी स्वयं की संरचना को गुणों और विधियों के किसी भी सेट के साथ परिभाषित कर सकता है।
Swift Evolution (SE-0143) के अनुसार, मानक प्रकारों को संरचनाओं के रूप में लागू करने का निर्णय प्रदर्शन और पूर्वानुमानशीलता के कारण है। Value types रेफरेंस साइकिल नहीं बनाते, ARC रेफरेंस काउंटिंग की आवश्यकता नहीं होती, और गारंटी देते हैं कि प्रतिलिपि में बदलाव मूल को प्रभावित नहीं करेगा — यह मल्टीथ्रेडेड परिदृश्यों में डेटा अपरिवर्तनीयता के लिए अत्यंत महत्वपूर्ण है।
Value type सिमैंटिक्स struct और class के बीच मुख्य अंतर है। जब आप एक संरचना को नए वेरिएबल में असाइन करते हैं या किसी फंक्शन में पास करते हैं, Swift सभी डेटा की स्वतंत्र प्रतिलिपि बनाता है। प्रतिलिपि में किए गए कोई भी बदलाव मूल को प्रभावित नहीं करते, जो रेफरेंस प्रकारों के विशिष्ट दुष्प्रभावों को समाप्त करता है।
// वैल्यू टाइप सिमैंटिक्स का उदाहरण
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2, p1 की एक स्वतंत्र प्रतिलिपि है
p2.x = 99 // केवल p2 बदलता है
print(p1.x) // 10 — p1 अपरिवर्तित
print(p2.x) // 99
Swift कॉपीिंग को ऑप्टिमाइज़ करने के लिए Copy-on-Write (COW) का उपयोग करता है। यदि कई वेरिएबल एक ही संरचना को संदर्भित करते हैं लेकिन उनमें से कोई भी डेटा को संशोधित नहीं करता, तो कोई वास्तविक कॉपी नहीं होती। Swift पहले म्यूटेशन तक वेरिएबल्स के बीच मेमोरी साझा करता है — तब एक वास्तविक प्रतिलिपि बनाई जाती है। यह अत्यधिक आवंटन संचालन को रोकता है और संग्रहों के साथ काम को गति देता है।
डिफ़ॉल्ट रूप से, संरचना की विधियाँ उसके गुणों को संशोधित नहीं कर सकतीं — Swift को उन विधियों के लिए स्पष्ट mutating कीवर्ड की आवश्यकता होती है जो बदलाव करती हैं। यह प्रतिबंध आकस्मिक म्यूटेशन से बचाता है और कोड को पूर्वानुमानित बनाता है: यदि कोई विधि mutating के रूप में चिह्नित नहीं है, तो आप गारंटी से संरचना नहीं बदलेंगे।
जब आप किसी विधि से पहले mutating कीवर्ड जोड़ते हैं, Swift को संरचना के गुणों में नए मान लिखने की क्षमता मिलती है। वास्तव में, विधि self = के माध्यम से संरचना इंस्टेंस को पूरी तरह से नए से बदल भी सकती है। यह तंत्र, उदाहरण के लिए, Option और Result प्रकारों में उपयोग किया जाता है।
// Mutating मेथड वाला struct
struct Counter {
private var value: Int = 0
// Mutating मेथड — गुणों को संशोधित कर सकता है
mutating func increment() {
value += 1
}
// Mutating मेथड self को पूरी तरह से बदल सकता है
mutating func reset() {
self = Counter()
}
// गैर-mutating मेथड — केवल पढ़ने के लिए
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Mutating के नियम: संरचना को var से घोषित किया जाना चाहिए, let से नहीं — एक स्थिर संरचना mutating विधि को कॉल नहीं कर सकती। कंपाइलर बिल्ड समय पर इसकी जाँच करता है: let-स्थिरांक पर mutating विधि कॉल करने का प्रयास संकलन त्रुटि का कारण बनेगा।
struct और class के बीच चुनाव Swift में मौलिक निर्णयों में से एक है। दोनों प्रकार गुण, विधियाँ, आरंभकर्ता रख सकते हैं और प्रोटोकॉल लागू कर सकते हैं, लेकिन मेमोरी सिमैंटिक्स, इनहेरिटेंस और जीवनचक्र प्रबंधन में मूलभूत अंतर हैं।
| विशेषता | struct | class |
|---|---|---|
| प्रकार | Value type (कॉपी होता है) | Reference type (संदर्भ) |
| इनहेरिटेंस | समर्थन नहीं करता | समर्थन करता है |
| ARC / रेफरेंस काउंटिंग | आवश्यक नहीं | ARC आवश्यक |
| डीइनिशियलाइज़ेशन | समर्थन नहीं करता | deinit का समर्थन करता है |
| स्थिरांक में गुण परिवर्तन | केवल var द्वारा | let द्वारा संभव (संदर्भ स्थिर है) |
| टाइप कास्टिंग | समर्थन नहीं करता | समर्थन करता है |
| संग्रहों में भंडारण | सीधे संग्रहीत (मान) | संदर्भ के रूप में संग्रहीत (पॉइंटर) |
संरचनाएँ तब पसंद की जाती हैं जब डेटा इनहेरिटेंस की आवश्यकता नहीं रखता, उसकी साझा पहचान नहीं होनी चाहिए (जैसे, निर्देशांक, आकार, कॉन्फ़िगरेशन) और मॉड्यूल के बीच पास किया जाता है। UI घटकों (UIView, UIViewController), सिंगलटन और साझा पहचान वाली वस्तुओं के लिए क्लासेस चुनी जाती हैं।
Apple Swift में डेटा मॉडलिंग के लिए struct को डिफ़ॉल्ट प्रकार के रूप में उपयोग करने की अनुशंसा करता है। संरचनाएँ पूर्वानुमानित कॉपी सिमैंटिक्स और रेफरेंस काउंटिंग के ओवरहेड की अनुपस्थिति के कारण अधिकांश परिदृश्यों के लिए उपयुक्त हैं। आइए विशिष्ट मामलों को देखें जहाँ struct सबसे अच्छा विकल्प है।
यदि किसी इकाई में इनहेरिटेंस की आवश्यकता के बिना डेटा है (Product, User, Order, Point), तो struct का उपयोग करें। कंपाइलर स्वचालित रूप से memberwise initializer उत्पन्न करता है — आपको मैन्युअल रूप से init लिखने की आवश्यकता नहीं है। Equatable और Hashable भी उन संरचनाओं के लिए स्वचालित रूप से लागू होते हैं जिनके सभी गुण इन प्रोटोकॉल का अनुपालन करते हैं।
कॉन्फ़िगरेशन, सेटिंग्स और फ़्लैग के लिए जो निर्माण के बाद नहीं बदलते, struct class से बेहतर है। एक स्थिर (let) संरचना सभी नेस्टेड फ़ील्ड की अपरिवर्तनीयता की गारंटी देती है — class में यह केवल संदर्भ पर लागू होता है, वस्तु की सामग्री पर नहीं।
वैल्यू सिमैंटिक्स के कारण मल्टीथ्रेडेड वातावरण में संरचनाएँ सुरक्षित हैं। प्रत्येक थ्रेड को डेटा की एक स्वतंत्र प्रतिलिपि मिलती है और वह अन्य थ्रेड्स को प्रभावित नहीं करता। Value types के लिए थ्रेड्स के बीच डेटा रेस असंभव हैं, जो SwiftUI में मॉडल के लिए struct को पसंदीदा विकल्प बनाता है (ObservableObject को class चाहिए, लेकिन @State struct का उपयोग करता है)।
// डेटा मॉडल के लिए struct उपयोग का उदाहरण
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// गणना की गई प्रॉपर्टी — non-mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// स्वचालित memberwise आरंभकर्ता
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// कॉपी करना मल्टी-थ्रेडिंग के लिए सुरक्षित है
var userCopy = user
userCopy.isPremium = false
// user.isPremium true रहता है
class का उपयोग करें जब आपको इनहेरिटेंस (UIKit/AppKit घटक), साझा पहचान (delegate, observer) या नियंत्रित वस्तु जीवनचक्र (deinit) की आवश्यकता हो। बाकी सबके लिए — struct का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
Struct Swift में एक वैल्यू टाइप है जो कोड के भागों के बीच पास करने पर कॉपी होता है। संरचनाओं में गुण, विधियाँ, आरंभकर्ता हो सकते हैं और वे प्रोटोकॉल लागू कर सकती हैं। Swift के मूल प्रकार (Int, String, Array) संरचनाओं के रूप में लागू किए गए हैं।
Struct एक value type है (असाइनमेंट पर कॉपी होता है), इनहेरिटेंस का समर्थन नहीं करता और ARC की आवश्यकता नहीं है। Class एक reference type है (संदर्भ द्वारा पास होता है), इनहेरिटेंस, डीइनिशियलाइज़ेशन और रेफरेंस काउंटिंग का समर्थन करता है। डेवलपर्स struct को डिफ़ॉल्ट प्रकार के रूप में सुझाते हैं।
Mutating एक कीवर्ड है जो इंगित करता है कि संरचना की कोई विधि उसके गुणों को बदल सकती है। Mutating के बिना, कंपाइलर फ़ील्ड संशोधन को रोकता है। Mutating विधियाँ केवल var से घोषित वेरिएबल पर कॉल की जा सकती हैं, let पर नहीं।
Copy-on-Write (COW) Swift का संरचनाओं के लिए एक ऑप्टिमाइज़ेशन है जिसमें डेटा की वास्तविक कॉपी पहले म्यूटेशन तक स्थगित कर दी जाती है। जब तक सभी वेरिएबल केवल संरचना को पढ़ते हैं, वे एक मेमोरी क्षेत्र साझा करते हैं। यह बड़े संग्रहों के साथ काम करते समय प्रदर्शन में सुधार करता है।
बिना इनहेरिटेंस के डेटा मॉडल, कॉन्फ़िगरेशन, DTO और मल्टीथ्रेडेड परिदृश्यों के लिए struct का उपयोग करें। UIKit/AppKit UI घटकों, सिंगलटन, साझा पहचान वाली संस्थाओं (delegate, observer) और डीइनिशियलाइज़ेशन की आवश्यकता वाली वस्तुओं के लिए class का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें