Extension Swift में एक तंत्र है जो मौजूदा प्रकारों में उनके स्रोत कोड को बदले बिना नई कार्यक्षमता जोड़ने की अनुमति देता है। एक्सटेंशन विधियों, परिकलित गुणों, आरंभकों, सबस्क्रिप्ट्स, नेस्टेड प्रकारों और प्रोटोकॉल अनुपालन का समर्थन करते हैं। Apple दस्तावेज़ीकरण, 2026 के अनुसार, एक्सटेंशन Swift परियोजनाओं में कोड संगठन और ओपन/क्लोज़्ड सिद्धांत के पालन के लिए एक महत्वपूर्ण उपकरण हैं।
मुख्य बातें
Extension Swift में एक भाषा निर्माण है जो मौजूदा प्रकार (क्लास, स्ट्रक्चर, एनम, प्रोटोकॉल) को नई क्षमताओं के साथ विस्तारित करने की अनुमति देता है। यह Objective-C में श्रेणियों के समान है लेकिन अधिक शक्तिशाली है।
Extension जोड़ सकता है:
Apple दस्तावेज़ीकरण के अनुसार, extension मौजूदा विधियों को ओवरराइड नहीं कर सकता (डायनामिक डिस्पैच) और संग्रहीत गुण नहीं जोड़ सकता। ये सीमाएँ मूल प्रकार की अखंडता को बनाए रखती हैं।
Extension की घोषणा कीवर्ड extension के साथ की जाती है जिसके बाद विस्तारित किए जाने वाले प्रकार का नाम आता है।
extension Double {
var km: Double { return self * 1000.0 }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
}
let distance = 5.0.km
print("5 km = \(distance) meters") // 5000.0
आप न केवल अपने स्वयं के प्रकार बल्कि Swift, Foundation, UIKit और अन्य फ्रेमवर्क के मानक पुस्तकालय प्रकारों को भी विस्तारित कर सकते हैं। यह extension को डोमेन-विशिष्ट कार्यक्षमता जोड़ने के लिए एक शक्तिशाली उपकरण बनाता है।
Extension किसी भी मौजूदा प्रकार में इंस्टेंस और प्रकार विधियाँ जोड़ने की अनुमति देता है।
extension String {
func isValidEmail() -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
return self.range(of: emailRegex, options: .regularExpression) != nil
}
static func random(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyz0123456789"
return String((0..<length).map { _ in letters.randomElement()! })
}
}
let email = "user@example.com"
print(email.isValidEmail()) // true
let code = String.random(length: 8) // "a3f8k2m1"
म्यूटेटिंग विधियाँ मान प्रकारों (struct, enum) का विस्तार करती हैं और self को संशोधित कर सकती हैं। क्लासेस के लिए म्यूटेटिंग की आवश्यकता नहीं है। Extension मानक पुस्तकालय प्रकारों में भी म्यूटेटिंग विधियाँ जोड़ सकता है।
Extension केवल परिकलित गुण जोड़ सकता है — संग्रहीत गुणों की अनुमति नहीं है। यह तर्कसंगत है क्योंकि extension मूल प्रकार की मेमोरी का प्रबंधन नहीं करता।
extension Date {
var isPast: Bool {
return self < Date()
}
var isToday: Bool {
return Calendar.current.isDateInToday(self)
}
}
let someDate = Date().addingTimeInterval(3600)
print(someDate.isPast) // false (one hour from now is future)
Extension में परिकलित गुण मुख्य कार्यान्वयन के समान नियमों का पालन करते हैं: आप { get } और { get set } गुण बना सकते हैं। Swift एक प्रकार के लिए एक्सटेंशन की संख्या पर कोई सीमा नहीं लगाता। आप एक प्रकार के लिए अलग-अलग फ़ाइलों में जितने चाहें उतने एक्सटेंशन घोषित कर सकते हैं — बड़ी परियोजनाओं में यह मानक अभ्यास है।
Extension प्रोटोकॉल लागू करने का पसंदीदा तरीका है। मुख्य प्रकार घोषणा को अव्यवस्थित करने के बजाय, सभी प्रोटोकॉल विधियों को एक अलग extension में रखा जाता है।
struct User {
let id: Int
let name: String
let email: String
}
// Extension per protocol — clean separation
extension User: Equatable {
static func == (lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
}
extension User: Codable {
enum CodingKeys: String, CodingKey {
case id, name, email
}
}
यह दृष्टिकोण जिम्मेदारियों को अलग करता है: मुख्य संरचना में केवल संग्रहीत गुण होते हैं, एक्सटेंशन में प्रोटोकॉल कार्यान्वयन होते हैं। Swift उन प्रकारों के लिए भी extension के माध्यम से प्रोटोकॉल लागू करने की अनुमति देता है जिन्हें हम नियंत्रित नहीं करते।
Extension केवल एक भाषा सुविधा नहीं है बल्कि वास्तुशिल्प संगठन का एक उपकरण है। एक्सटेंशन का उचित उपयोग कोड को पढ़ने योग्य और बनाए रखने योग्य बनाता है।
// MARK: - Equatable नेविगेशन के लिएprivate के रूप में चिह्नित// MARK: - User + Displayable
extension User: Displayable {
var displayName: String {
return "\(name) (\(email))"
}
}
Swift API डिज़ाइन दिशानिर्देशों के अनुसार, एक्सटेंशन पठनीयता में सुधार करते हैं: डेवलपर मुख्य घोषणा में डेटा संरचना और एक्सटेंशन में तर्क देखता है। यह इंटरफ़ेस पृथक्करण सिद्धांत के अनुरूप है।
where बाधाओं वाला extension केवल विशिष्ट प्रकारों के लिए विधियाँ जोड़ता है: extension Array where Element: Equatable { func isUnique() -> Bool }. ऐसा कोड संक्षिप्त और प्रकार-सुरक्षित है — isUnique विधि केवल Equatable तत्वों वाले ऐरे पर दिखाई देती है, संकलन समय पर त्रुटियों को समाप्त करती है और API को अन्य डेवलपर्स के लिए साफ़, सुरक्षित और स्पष्ट बनाती है।
अक्सर पूछे जाने वाले प्रश्न
नहीं, extension संग्रहीत गुण नहीं जोड़ सकता। यह सीमा मौलिक है: extension प्रकार के उदाहरण के लिए मेमोरी आवंटन में भाग नहीं लेता। संग्रहीत गुणों के लिए, मुख्य प्रकार घोषणा का उपयोग करें।
नहीं, extension विधियों को ओवरराइड नहीं कर सकता। मौजूदा विधि के समान हस्ताक्षर वाली विधि घोषित करने का प्रयास संकलन त्रुटि का कारण बनेगा। ओवरराइडिंग के लिए, क्लास इनहेरिटेंस का उपयोग करें।
Extension नया प्रकार बनाए बिना कार्यक्षमता जोड़ता है। Subclassing एक पदानुक्रम बनाता है और ओवरराइडिंग का समर्थन करता है। Extension को मूल स्रोत कोड तक पहुँच की आवश्यकता नहीं होती और यह सभी प्रकारों के साथ काम करता है।
हाँ, extension जेनेरिक हो सकता है यदि विस्तारित प्रकार जेनेरिक है: extension Array where Element: Numeric. आप extension के अंदर अपने स्वयं के प्रकार मापदंडों के साथ जेनेरिक विधियाँ भी जोड़ सकते हैं।
Extension प्रदर्शन को प्रभावित नहीं करता — extension विधियाँ सामान्य विधियों की तरह संकलित होती हैं। extension वाले प्रोटोकॉल के लिए स्थैतिक डिस्पैच का उपयोग किया जाता है, जो क्लासेस के डायनामिक डिस्पैच से तेज़ हो सकता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें