Generic (सामान्य प्रोग्रामिंग) — Swift में एक तन्त्र है जो पैरामीटरिक्षित प्रकार
मुख्य बातें
Generic (सामान्य प्रकार) — Swift में एक सिंटैक्स संरचना है जो प्रकार पैरामीटरिक्षण के साथ लचीला, पुनःप्रयोज्य कोड लिखने की अनुमति देती है। विशिष्ट प्रकार के बजाय, एक प्लेसहोल्डर कोणाक्र ब्रैकेट में लिखा जाता है — आमतौर पर
ग्जेनरिक्स के बिना, आपको प्रत्येक प्रकार के लिए अलग-अलग फ़ंक्शन लिखने होंगे: swapInts, swapStrings, swapDates. एक generic swap फ़ंक्शन तीनों वैरिएंट्स को एक ही घोषणा से बदल देता है। यह दुहराव कम करता है, पढ़ने योग्यता बढ़ाता है और कोड कॉपी करते समय त्रुटियों की संभावना कम करता है।
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var x = 10
var y = 20
swapValues(&x, &y)
Swift कंपाइलर generic के प्रत्येक विशिष्ट उपयोग के लिए विशेषीकृत कोड उत्पन्न करता है। इसका मतलब है कि generic फ़ंक्शन swapValues
सामान्य फ़ंक्शन वे फ़ंक्शन हैं जो एक या अधिक प्रकार पैरामीटर स्वीकार करते हैं। प्रकार पैरामीटर फ़ंक्शन के नाम के बाद कोणाक्र ब्रैकेट में निर्दिष्ट किए जाते हैं:
एक फ़ंक्शन में एकाधिक generic पैरामीटर हो सकते हैं। उदाहरण के लिए, फ़ंक्शन findKey
func findKey<K: Hashable, V>(
for value: V,
in dictionary: [K: V]
) -> K? where V: Equatable {
for (key, dictValue) in dictionary {
if dictValue == value {
return key
}
}
return nil
}
बन्धन K: Hashable और where V: Equatable सुनिश्चित करते हैं कि findKey केवल एक शब्दकोश के साथ ही बुलाया जा सकता है जिसकी कुंजीं हैशेबल और मान इक्विटेबल हैं। ऐसे बन्धन नौकरशाही नहीं बल्कि आवश्यकता हैं: Hashable के बिना आप कुंजी लूकअप को इंडेक्स नहीं कर सकते, Equatable के बिना आदिबि की value से तुलना नहीं कर सकते।
where — Swift की एक कीवर्ड है जो generic पैरामीटरों पर अतिरिक्त बन्धन लगाता है। कोणाक्र ब्रैकेट (
where क्लॉज़ फ़ंक्शन या प्रकार हस्ताक्षर के बाद, खुलने वाले ब्रेस से पहले लिखा जाता है। where में आप निर्दिष्ट कर सकते हैं कि T: Comparable & Hashable (एक साथ दो प्रोटोकॉल्स का अनुसरण करता है), या T.U == Int (एक संबद्ध प्रकार को मूर्त करता है)।
protocol Container {
associatedtype Item
mutating func append(_ item: Item)
var count: Int { get }
}
extension Container where Item: Comparable {
func isSorted() -> Bool {
// Implementation available only if Item: Comparable
return true
}
}
where के साथ एक्सटेंशन केवल उन प्रकारों के लिए ही विधियाँ जोड़ता है जो शर्त को पूरा करते हैं। Container
Associated Types (संबद्ध प्रकार) — प्रोटोकॉल को घोषणा चरण में विशिष्ट प्रकार निर्दिष्ट किए बिना सामान्य बनाने का एक तरीका है।
where का उपयोग करके आप विभिन्न प्रोटोकॉल्स के associated types के बीच संबंध स्थापित कर सकते हैं। उदाहरण के लिए, आप आवश्यकता रख्वा सकते हैं कि एक प्रोटोकॉल का Item दूसरे के Iterator.Element से मेल खाता हो। यह कंपाइलर स्तर पर प्रकार अनुकूलता सुनिश्चित करता है।
protocol StackProtocol {
associatedtype Element
mutating func push(_ item: Element)
mutating func pop() -> Element?
}
struct IntStack: StackProtocol {
typealias Element = Int
private var items: [Int] = []
mutating func push(_ item: Int) { items.append(item) }
mutating func pop() -> Int? { items.popLast() }
}
IntStack typealias का उपयोग करके Element को Int के रूप में मूर्त करता है। कंपाइलर जाँचता है कि प्रोटोकॉल की सभी आवश्यकताएँ इस प्रकार के साथ पूरी होती हैं। associated types के बिना, आपको एक generic प्रोटोकॉल के सاथ StackProtocol
Generic एक्सटेंशन अतिरिक्त बन्धनों के साथ एक generic प्रकार में विधियाँ जोड़ने की अनुमति देते हैं। यह सार्तिक अनुरूपता पैटर्न है, जहाँ एक प्रकार को केवल निश्चित शर्तों में ही कार्यक्षमता मिलती है। सबस्क्रिप्ट भी generic हो सकते हैं।
एक सबस्क्रिप्ट generic हो सकता है: यह कोणाक्र ब्रैकेट में generic पैरामीटर स्वीकार करता है। यह मनमानी इंडेक्स के साथ संग्रहों तक सुरक्षित पहुंच के लिए उपयोगी है, जहाँ इंडेक्स विभिन्न प्रकार का हो सकता है।
extension Array where Element: Numeric {
func sum() -> Element {
return reduce(0, +)
}
}
extension Array {
subscript<Indices: Sequence>(indices: Indices) -> [Element]
where Indices.Element == Int {
return indices.map { self[$0] }
}
}
यह संरचना शक्तिशाली संरचना प्रदान करती है: sum विधि केवल संख्यात्मक एरे पर दिखाई देती है, और मनमानी इंडेक्स वाला सबस्क्रिप्ट पूर्णांक इंडेक्स के किसी भी अनुक्रम के साथ काम करता है। कंपाइलर where शर्तों के आधार पर इन सदस्यों की दृश्यता का प्रबंधन स्वयं करता है।
गलतियाँ generic का उपयोग करते समय अक्सर गलत बन्धनों या जहाँ विशिष्ट प्रकार की आवश्यकता है वहाँ generic का उपयोग करने के प्रयास से संबंधित होती हैं। आइए तीन सामान्य परिदृश्यों को देखें जिनका डिवेलपरों को सामना करना पड़ता है।
जहाँ विशिष्ट प्रकार पर्याप्त है वहाँ generic पैरामीटर जोड़ना एक प्रतिस्वरूप है। यदि कोई फ़ंक्शन हमेशा String के साथ काम करता है, तो उसे
यह निर्दिष्ट किए बिना कि विधि मौजूद है, generic पैरामीटर पर किसी विधि को कॉल करना एक त्रुटि है।
// ❌ Error: value has no count method
func countElements<T>>(value: T) -> Int { value.count }
// ✅ Works: T: Collection guarantees count exists
func countElements<T: Collection>(value: T) -> Int { value.count }
त्रुटि स्पष्ट है: generic
अक्सर पूछे जाने वाले प्रश्न
Generic कोड लिखने का एक तरीका है जो किसी भी प्रकार के साथ काम करता है, बिना Int, String और अन्य प्रकारों के लिए एक ही तर्क को दुहराए। विशिष्ट प्रकार के बजाय, एक प्लेसहोल्डर
Generic कंपाइल टाइम पर विशिष्ट प्रकार की जानकारी संरक्षित रखता है, जिससे कंपाइलर प्रकारों की जाँच कर सकता है और ऑप्टिमिज़्ड कोड उत्पन्न कर सकता है। Any प्रकार मिटाना है: कोई भी मान पास किया जा सकता है, लेकिन प्रकार खो जाता है और कास्टिंग (as?) की आवश्यकता होती है।
कोणाक्र ब्रैकेट में T: SomeProtocol सिंटैक्स या एक अलग क्लॉज़ where T: SomeProtocol का उपयोग करें। बन्धन सुनिश्चित करते हैं कि generic पैरामीटर विशिष्ट विधियों और गुणों का समर्थन करता है।
Associated Type (associatedtype) एक प्रोटोकॉल के अंदर एक प्रकार के लिए एक प्लेसहोल्डर है। प्रोटोकॉल एक विशिष्ट प्रकार निर्दिष्ट नहीं करता बल्कि एक associatedtype घोषित करता है, जो कार्यान्वयन में मूर्त होता है: Array का Element, Dictionary का Key और Value।
Swift generic कोड को प्रत्येक विशिष्ट प्रकार के लिए विशेषीकृत संस्करणों में कंपाइल करता है। व्यावहारिक रूप से, Int के लिए एक generic फ़ंक्शन Int के लिए हाथ से लिखे फ़ंक्शन से धीमा नहीं है। अमूर्तीकरण का कोई ओवरहेड नहीं है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें