ViewModifier SwiftUI में एक प्रोटोकॉल है जो View के स्वरूप और व्यवहार को बदलने के लिए पुनः प्रयोज्य मॉडिफायर बनाने की अनुमति देता है। Apple Developer Documentation, 2024 के अनुसार, ViewModifier को body(content:) method को लागू करने की आवश्यकता होती है, जो मूल View लेता है और एक संशोधित View लौटाता है, बिल्ट-इन मॉडिफायर के किसी भी संयोजन को एक ही प्रकार में एनकैप्सुलेट करता है। इस प्रोटोकॉल के बिना, डेवलपर्स को उपयोग के हर बिंदु पर समान मॉडिफायर चेन को दोहराना पड़ता।
मुख्य बातें
ViewModifier एक SwiftUI प्रोटोकॉल है जो मॉडिफायर बनाने के लिए एक अनुबंध परिभाषित करता है जिसे किसी भी View प्रकार पर लागू किया जा सकता है। इसे protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body } के रूप में घोषित किया जाता है, जहाँ Content मॉडिफायर को पारित मूल View का प्रकार है।
ViewModifier प्रोटोकॉल SwiftUI के पहले संस्करण के साथ iOS 13 में दिखाई दिया और iOS 18+ तक स्थिर बना हुआ है। मुख्य लक्ष्य डेवलपर्स को दोहराई जाने वाली मॉडिफायर चेन को एक पुनः प्रयोज्य प्रकार में एनकैप्सुलेट करने के लिए एक तंत्र प्रदान करना है। ViewModifier के बिना, हर बार जब आपको स्टाइल का एक ही सेट लागू करने की आवश्यकता होती, तो आपको सभी मॉडिफायर को मैन्युअल रूप से दोहराना पड़ता।
Swift by Sundell (2023) के अनुसार, ViewModifier SwiftUI परियोजनाओं में स्टाइल को व्यवस्थित करने का पसंदीदा तरीका है जब मॉडिफायर का एक ही सेट तीन या अधिक स्थानों पर उपयोग किया जाता है। एक बार के संयोजनों के लिए, सीधे View पर बिल्ट-इन मॉडिफायर की एक श्रृंखला पर्याप्त है।
ViewModifier प्रोटोकॉल को एक method body(content:) को लागू करने की आवश्यकता होती है और वैकल्पिक रूप से कस्टम मॉडिफायर के इनिशियलाइज़र पैरामीटर के माध्यम से व्यवहार को अनुकूलित करने के लिए गुण प्रदान कर सकता है।
ViewModifier प्रोटोकॉल body(content:) method को परिभाषित करता है, जो मूल View (प्रकार Content) प्राप्त करता है और एक संशोधित View (प्रकार Body) लौटाता है। SwiftUI View पर मॉडिफायर को content के रूप में पास करके लागू करता है और प्रदर्शन के लिए परिणाम का उपयोग करता है।
struct CardStyle: ViewModifier {
func body(content: Content) -> some View {
content
.padding(16)
.background(Color.white)
.cornerRadius(12)
.shadow(radius: 4, x: 0, y: 2)
}
}
// उपयोग:
Text("नमस्ते, SwiftUI!")
.modifier(CardStyle())
जब आप .modifier(CardStyle()) कॉल करते हैं, SwiftUI ModifiedContent<Text, CardStyle> का एक उदाहरण बनाता है जो मूल View और मॉडिफायर को संग्रहीत करता है। रेंडरिंग के दौरान, SwiftUI CardStyle.body(content: text) कॉल करता है, जिसमें padding, background, cornerRadius और shadow के साथ एक संशोधित View प्राप्त होती है।
महत्वपूर्ण अंतर: ViewModifier.body को हर बार View अपडेट होने पर कॉल किया जाता है, इसलिए body के अंदर भारी गणना या साइड इफेक्ट नहीं होने चाहिए। यदि मॉडिफायर बाहरी डेटा (state, environment) पर निर्भर करता है, तो उन्हें इनिशियलाइज़र पैरामीटर के माध्यम से पास करें।
SwiftUI के बिल्ट-इन मॉडिफायर (font, foregroundColor, frame, padding) View प्रोटोकॉल के एक्सटेंशन method हैं जो ModifiedContent प्रकार लौटाते हैं। वे सीधे ViewModifier को लागू नहीं करते — SwiftUI प्रत्येक बिल्ट-इन मॉडिफायर के लिए आंतरिक अनुकूलित कार्यान्वयन का उपयोग करता है।
| विशेषता | बिल्ट-इन मॉडिफायर | कस्टम ViewModifier |
|---|---|---|
| कार्यान्वयन | View एक्सटेंशन method | ViewModifier प्रोटोकॉल |
| पुनः उपयोग | एक बार की श्रृंखला | कई बार उपयोग |
| पैरामीटर | निश्चित (रंग, आकार) | इनिशियलाइज़र के माध्यम से कोई भी |
| प्रदर्शन | अधिकतम (आंतरिक अनुकूलन) | थोड़ा अधिक ओवरहेड |
| वापसी प्रकार | ModifiedContent | ModifiedContent |
कस्टम ViewModifier उचित है जब मॉडिफायर का एक ही संयोजन दो या अधिक स्थानों पर उपयोग किया जाता है। एक बार के उपयोग के लिए, सीधी मॉडिफायर श्रृंखला बेहतर है — कोड पढ़ने योग्य रहता है और कंपाइलर बेहतर अनुकूलन करता है।
WWDC 2023 के अनुसार, Apple एप्लिकेशन की डिज़ाइन प्रणाली से संबंधित स्टाइल के लिए कस्टम ViewModifier बनाने की सिफारिश करता है: कार्ड, बटन, इनपुट फ़ील्ड। यह एकरूपता सुनिश्चित करता है और डिज़ाइन बदलने पर रखरखाव को सरल बनाता है।
पैटर्न 1: डिज़ाइन सिस्टम एनकैप्सुलेशन। ViewModifier का सबसे सामान्य उपयोग मामला एप्लिकेशन में दृश्य स्टाइल के लिए सत्य का एकल स्रोत बनाना है। प्रत्येक डिज़ाइन सिस्टम तत्व (कार्ड, बटन, शीर्षक) को अपना मॉडिफायर मिलता है।
struct PrimaryButton: ViewModifier {
var isEnabled: Bool
func body(content: Content) -> some View {
content
.font(.headline.weight(.semibold))
.foregroundColor(.white)
.padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
.background(isEnabled ? Color.blue : Color.gray)
.cornerRadius(8)
.opacity(isEnabled ? 1.0 : 0.6)
}
}
पैटर्न 2: सशर्त मॉडिफायर अनुप्रयोग। कभी-कभी आपको केवल एक निश्चित शर्त के तहत मॉडिफायर लागू करने की आवश्यकता होती है। बूलियन पैरामीटर वाला ViewModifier इस तर्क को body के अंदर एनकैप्सुलेट करने की अनुमति देता है।
पैटर्न 3: मॉडिफायर संयोजन। एक ViewModifier अपने body के अंदर अन्य ViewModifier लागू कर सकता है। यह मॉडिफायर का एक पदानुक्रम बनाने की अनुमति देता है, जहाँ प्रत्येक दृश्य प्रस्तुति के अपने पहलू के लिए जिम्मेदार है। उदाहरण के लिए, CardStyle आंतरिक रूप से ShadowStyle और BorderStyle लागू कर सकता है।
Point-Free (2024) के अनुसार, ViewModifier के माध्यम से मॉडिफायर का संयोजन विरासत से बेहतर है: प्रत्येक मॉडिफायर एक कार्य के लिए जिम्मेदार है, और उन्हें स्वतंत्र रूप से जोड़ा जा सकता है। यह SwiftUI में एकल जिम्मेदारी सिद्धांत का पालन करता है।
ViewModifier का प्रदर्शन प्रत्येक अनुप्रयोग के साथ बनाए गए ModifiedContent रैपर की संख्या पर निर्भर करता है। SwiftUI रेंडरिंग चरण में डिफिंग के माध्यम से मॉडिफायर श्रृंखलाओं को अनुकूलित करता है, लेकिन मॉडिफायर की अत्यधिक संख्या अपडेट को धीमा कर सकती है।
| मॉडिफायर की संख्या | प्रदर्शन पर प्रभाव | अनुशंसा |
|---|---|---|
| 1–5 | न्यूनतम | किसी भी View के लिए सामान्य |
| 5–10 | मध्यम | ViewModifier में समूहित करें |
| 10–20 | ध्यान देने योग्य | एक कस्टम मॉडिफायर में संयोजित करें |
| 20+ | गंभीर | View आर्किटेक्चर पर पुनर्विचार करें |
अनुकूलन: एक ही प्रकार के कई अनुक्रमिक मॉडिफायर (जैसे, कई padding) को एक में संयोजित करें। PreferenceKey का उपयोग केवल तभी करें जब वास्तव में आवश्यक हो — प्राथमिकताएँ पढ़ने वाले मॉडिफायर एक अतिरिक्त रेंडरिंग पास को ट्रिगर करते हैं।
सामान्य नियम: यदि किसी View में 10 से अधिक मॉडिफायर हैं — उनमें से कुछ को कस्टम ViewModifier में निकालें। इससे पठनीयता में सुधार होगा और SwiftUI अपडेट को अनुकूलित कर सकेगा। SwiftUI Lab (2024) के अनुसार, ViewModifier में मॉडिफायर को समूहित करने से जटिल Views के लिए रेंडरिंग समय 15–30% कम हो जाता है।
अक्सर पूछे जाने वाले प्रश्न
ViewModifier पुनः प्रयोज्य मॉडिफायर बनाने के लिए एक प्रोटोकॉल है जो View के स्वरूप या व्यवहार को बदलते हैं। इसमें body(content:) method को लागू करने की आवश्यकता होती है, जो मूल View लेता है और एक संशोधित View लौटाता है।
बिल्ट-इन मॉडिफायर (font, padding) View प्रोटोकॉल के एक्सटेंशन method हैं जो आंतरिक अनुकूलित कार्यान्वयन का उपयोग करते हैं। ViewModifier कस्टम मॉडिफायर के लिए एक प्रोटोकॉल है जो बिल्ट-इन के संयोजन को एनकैप्सुलेट करता है और इनिशियलाइज़र पैरामीटर हो सकते हैं।
कस्टम ViewModifier बनाएँ जब मॉडिफायर का एक ही संयोजन तीन या अधिक स्थानों पर उपयोग किया जाता है। एक बार की श्रृंखलाओं के लिए, View पर सीधे मॉडिफायर का उपयोग करें — यह सरल और अधिक कुशल है।
हाँ, ViewModifier में @State या @Environment गुण हो सकते हैं। SwiftUI उनके जीवनचक्र का प्रबंधन उसी तरह करता है जैसे View के लिए करता है। हालाँकि, याद रखें कि body को हर अपडेट पर कॉल किया जाता है, इसलिए मॉडिफायर के body में भारी संचालन से बचें।
@ViewBuilder के अंदर if/else का उपयोग करें या बूलियन पैरामीटर वाला मॉडिफायर बनाएँ जो body के अंदर सशर्त रूप से परिवर्तन लागू या छोड़ देता है। उदाहरण के लिए, ऊपर PrimaryButton सशर्त स्टाइल अनुप्रयोग के लिए isEnabled का उपयोग करता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें