Result Builder एक Swift विशेषता है जो प्रोटोकॉल @resultBuilder के माध्यम से कार्यान्वित होती है, जो अभिव्यक्तियों के अनुक्रम को एक समग्र मान में रूपांतरित करती है। कंपाइलर नियंत्रण संरचनाओं if, for, switch वाले कोड ब्लॉक को बिल्डर की स्थैतिक विधियों — buildBlock, buildEither, buildArray — के कॉल में बदल देता है। Swift Evolution प्रस्ताव SE-0289 (2022) के अनुसार, result builders बाहरी पार्सर्स के बिना Swift के अंदर घोषणात्मक DSL बनाने की अनुमति देते हैं। सबसे प्रसिद्ध उदाहरण SwiftUI में @ViewBuilder है, जहाँ व्यू का बॉडी सशर्त और चक्रीय तत्वों से घोषणात्मक शैली में बनाया जाता है।
मुख्य निष्कर्ष
TupleView में रूपांतरित करता हैif/else, switch, for-in को विधियों buildOptional, buildEither, buildArray के माध्यम से समर्थन करता हैResult Builder (पहले function builders के नाम से जाना जाता था) एक Swift तंत्र है जो लाइन ब्रेक द्वारा अलग की गई अभिव्यक्तियों के अनुक्रम को एक एकल मान में बदलने की अनुमति देता है। इसे @resultBuilder विशेषता का उपयोग करके घोषित किया जाता है जो एक संरचना पर लागू होती है जो स्थैतिक रूपांतरण विधियों को कार्यान्वित करती है।
Result builders से पहले, SwiftUI body की घोषणात्मक सिंटैक्स असंभव थी। व्यू की एक कॉम्पैक्ट सूची के बजाय, डेवलपर्स को मैन्युअल रूप से TupleView कॉल लिखने पड़ते। Result Builder स्वचालित रूप से प्रत्येक अभिव्यक्ति को लपेटता है, शाखाकरण और लूप का समर्थन करता है, डेवलपर से संरचना की जटिलता को छिपाता है।
Swift Evolution SE-0289 के अनुसार, 2022 में स्वीकृत, result builder function builders (SE-0258, Swift 5.1) के विचार का विकास है। मुख्य परिवर्तन: @_functionBuilder से @resultBuilder में नाम बदलना और फंक्शन पैरामीटर तक विस्तार, जिससे बिल्डर को केवल व्यू बॉडी के बजाय किसी भी क्लोज़र आर्गुमेंट के लिए उपयोग किया जा सके।
Result builders का उपयोग करें जब आपको अपनी लाइब्रेरी के उपयोगकर्ताओं को जटिल संरचनाएँ बनाने के लिए एक घोषणात्मक सिंटैक्स प्रदान करने की आवश्यकता हो — कॉन्फ़िगरेशन, क्वेरी, UI घटक — अनिवार्य असेंबली कोड लिखे बिना।
Swift कंपाइलर @resultBuilder से चिह्नित प्रत्येक कोड ब्लॉक को बिल्डर की स्थैतिक विधियों के कॉल के अनुक्रम में बदल देता है। आइए एक सरल बिल्डर देखें जो स्ट्रिंग को जोड़ता है:
@resultBuilder
struct StringBuilder {
static func buildBlock(_ parts: String...) -> String {
parts.joined(separator: " ")
}
}
इस बिल्डर का उपयोग — प्रत्येक स्ट्रिंग एक अलग लाइन पर एक स्थान के साथ जुड़ती है:
@StringBuilder
func greeting() -> String {
"Hello"
"World"
"from"
"Swift"
}
// कंपाइलर इसे बदलता है:
// StringBuilder.buildBlock("Hello", "World", "from", "Swift")
// परिणाम: "Hello World from Swift"
कंपाइलर लगातार अभिव्यक्तियों को समूहित करता है और उन्हें buildBlock में वेरिएडिक पैरामीटर के रूप में पास करता है। यदि अभिव्यक्तियों के बीच if आता है, तो कंपाइलर शाखाकरण के लिए buildOptional या buildEither को कॉल करता है। for-in लूप के लिए यह buildArray को कॉल करता है। इस प्रकार, सामान्य Swift कोड कॉल की एक श्रृंखला में बदल जाता है जो अंतिम मान का निर्माण करती है।
प्रत्येक result builder स्थैतिक विधियों का एक सेट परिभाषित करता है जिसे कंपाइलर रूपांतरण के दौरान कॉल करता है। मुख्य विधियाँ:
| विधि | उद्देश्य | कब कॉल होती है |
|---|---|---|
| buildBlock | अभिव्यक्तियों के अनुक्रम को जोड़ता है | प्रत्येक ब्लॉक के लिए बिना शाखाकरण के |
| buildOptional | if को बिना else के संभालता है | जब if बिना else के हो |
| buildEither(first:) | if-else की पहली शाखा | if के साथ else पर |
| buildEither(second:) | if-else की दूसरी शाखा | if के साथ else पर |
| buildArray | for-in लूप को संभालता है | जब for-in मौजूद हो |
| buildExpression | व्यक्तिगत अभिव्यक्तियों को रूपांतरित करता है | प्रत्येक अभिव्यक्ति के लिए buildBlock में पास करने से पहले |
| buildFinalResult | अंतिम रूपांतरण | क्लोज़र से लौटने से पहले |
न्यूनतम कार्यान्वयन के लिए केवल वेरिएडिक पैरामीटर के साथ buildBlock की आवश्यकता है — यह बिना शाखाकरण वाले ब्लॉक के लिए पर्याप्त है। buildOptional और buildEither जोड़ने से सशर्त संरचनाओं का समर्थन शामिल होता है, और buildArray लूप का। Swift दस्तावेज़ीकरण (2025) के अनुसार, अधिकतम DSL लचीलेपन के लिए सभी विधियों को कार्यान्वित करने की अनुशंसा की जाती है।
buildExpression विभिन्न प्रकारों की अभिव्यक्तियों को स्वीकार करने और उन्हें एकल बिल्डर प्रकार में बदलने की अनुमति देता है। उदाहरण के लिए, @ViewBuilder में, buildExpression Text, Image, Button को स्वीकार करता है और उन्हें सामान्य View प्रकार में बदल देता है।
आइए HTML स्ट्रिंग बनाने के लिए एक बिल्डर बनाने पर विचार करें। यह DSL सीधे Swift में घोषणात्मक HTML लिखने की अनुमति देगा:
@resultBuilder
enum HTMLBuilder {
static func buildBlock(_ components: String...) -> String {
components.joined()
}
static func buildOptional(_ component: String?) -> String {
component ?? ""
}
static func buildEither(first component: String) -> String {
component
}
static func buildEither(second component: String) -> String {
component
}
static func buildArray(_ components: [String]) -> String {
components.joined()
}
}
HTML जनरेट करने के लिए कस्टम बिल्डर का उपयोग:
func div(@HTMLBuilder _ content: () -> String) -> String {
"<div>\(content())</div>"
}
func p(_ text: String) -> String {
"<p>\(text)</p>"
}
let page = div {
p("Hello")
p("World")
if showFooter {
p("पाद लेख")
}
}
// परिणाम: <div><p>Hello</p><p>World</p><p>Footer</p></div>
Swift.org (2025) के लेख “Building Custom Result Builders in Swift” के अनुसार, कस्टम बिल्डर का उपयोग लाइब्रेरीज़ में कॉन्फ़िगरेशन फ़ाइलें, UI घटक, डेटा मैपिंग, और यहाँ तक कि डेटाबेस क्वेरी बनाने के लिए किया जाता है — हर जगह जहाँ शाखाकरण समर्थन के साथ घोषणात्मक सिंटैक्स की आवश्यकता होती है।
@ViewBuilder SwiftUI में निर्मित एक result builder है जो अधिकांश कंटेनर व्यू के content पैरामीटर पर लागू होता है: VStack, HStack, ZStack, Group, List, और स्वयं body गुण। यह अल्पविराम या रैपर के बिना अलग-अलग पंक्तियों पर कई व्यू लिखने की अनुमति देता है।
@ViewBuilder सभी result builder विधियों को कार्यान्वित करता है, जिसमें if-else, switch, और for-in का समर्थन शामिल है। जब कोई शर्त सत्य होती है, buildEither(first:) एक व्यू लौटाता है; जब असत्य, buildEither(second:) दूसरा लौटाता है। दोनों शाखाओं को एक ही प्रकार लौटाना चाहिए, लेकिन SwiftUI आंतरिक रूप से AnyView या ConditionalContent के माध्यम से प्रकार विलोपन का उपयोग करता है।
struct GreetingView: View {
let isLoggedIn: Bool
var body: some View {
VStack {
Image(systemName: "person.circle")
Text("प्रोफ़ाइल")
.font(.title)
if isLoggedIn {
Text("वापस स्वागत है!")
.foregroundColor(.green)
} else {
Button("लॉग इन करें") { }
}
}
}
}
@ViewBuilder के बिना, उसी कोड को प्रत्येक सशर्त खंड के लिए Group या AnyView के उपयोग की आवश्यकता होती, जो प्रदर्शन को खराब करता है। @ViewBuilder स्वचालित रूप से प्रत्येक संयोजन के लिए सबसे कुशल प्रतिनिधित्व — ConditionalContent या TupleView — का चयन करता है।
पहली सीमा buildBlock में अभिव्यक्तियों की अधिकतम संख्या है। Swift मानक पुस्तकालय 2–10 अभिव्यक्तियों के लिए buildBlock के ओवरलोड को परिभाषित करता है। यदि किसी ब्लॉक में 10 से अधिक अभिव्यक्तियाँ हैं, तो कंपाइलर एक त्रुटि उत्पन्न करेगा। समाधान — उप-ब्लॉक में विभाजित करने के लिए Group या VStack के माध्यम से समूहीकरण।
दूसरी सीमा बिल्डर ब्लॉक के अंदर चर और असाइनमेंट के समर्थन की कमी है। @ViewBuilder के अंदर let x = 5 घोषित नहीं किया जा सकता। सभी अभिव्यक्तियाँ ऐसी अभिव्यक्तियाँ होनी चाहिए जो बिल्डर प्रकार का मान लौटाती हैं। मध्यवर्ती गणनाओं के लिए, बिल्डर के बाहर गणनाएँ या विभिन्न प्रकारों के समर्थन के साथ buildExpression का उपयोग करें।
तीसरी सीमा डीबगिंग की जटिलता है। Result builder के अंदर संकलन त्रुटियाँ अक्सर भ्रामक संदेश देती हैं, विशेषकर जब if/else शाखाओं में प्रकार मेल नहीं खाते। डीबगिंग के लिए स्पष्ट रिटर्न प्रकार और AnyView का उपयोग करें, हालाँकि बाद वाला प्रदर्शन को कम करता है। Hacking with Swift (2025) के अनुसार, व्यावहारिक सुझाव — बिना शाखाकरण के एक सरल बिल्डर से शुरू करें और धीरे-धीरे सशर्त संरचनाओं का समर्थन जोड़ें।
अक्सर पूछे जाने वाले प्रश्न
Result Builder एक Swift विशेषता है जो स्थैतिक विधियों के माध्यम से अभिव्यक्तियों के अनुक्रम को परिणामी मान में बदलती है। यह घोषणात्मक DSL बनाने की अनुमति देता है, सबसे प्रसिद्ध उदाहरण SwiftUI में @ViewBuilder है जो अनिवार्य कोड के बिना व्यू पदानुक्रम बनाने के लिए है।
@resultBuilder विशेषता वाली एक संरचना घोषित करें और कम से कम buildBlock विधि को कार्यान्वित करें। शर्तों के समर्थन के लिए buildOptional और buildEither जोड़ें; लूप के लिए buildArray जोड़ें। फ़ंक्शन में क्लोज़र पैरामीटर से पहले बिल्डर विशेषता का उपयोग करें।
केवल buildBlock अनिवार्य है। अन्य सभी विधियाँ — buildOptional, buildEither, buildArray, buildExpression, buildFinalResult — वैकल्पिक हैं और संबंधित संरचनाओं का समर्थन जोड़ती हैं। जितनी अधिक विधियाँ कार्यान्वित की जाती हैं, DSL उतना ही लचीला होता है।
@ViewBuilder View प्रोटोकॉल के लिए result builder का एक ठोस कार्यान्वयन है। इसे SwiftUI में @resultBuilder विशेषता वाली संरचना के रूप में परिभाषित किया गया है, जो विभिन्न संख्याओं के व्यू (TupleView) के लिए buildBlock विधियाँ, ConditionalContent के लिए buildEither और ForEach के लिए buildArray प्रदान करता है।
हाँ, मानक buildBlock ओवरलोड 10 अभिव्यक्तियों तक का समर्थन करते हैं। इससे अधिक होने पर, उप-ब्लॉक में विभाजित करने के लिए नेस्टेड कंटेनर (Group, VStack) का उपयोग करें। एक कस्टम बिल्डर बिना सीमा के वेरिएडिक buildBlock परिभाषित कर सकता है।
सारांश
buildBlock, buildEither, buildOptional, buildArray के कॉल से बदल देता हैहम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें