Result Builder — यह क्या है, सिंटैक्स और उपयोग

लेखक: IT Sectr प्रकाशित: 2026-06-20 पढ़ने का समय: 8 मिनट

Result Builder एक Swift विशेषता है जो प्रोटोकॉल @resultBuilder के माध्यम से कार्यान्वित होती है, जो अभिव्यक्तियों के अनुक्रम को एक समग्र मान में रूपांतरित करती है। कंपाइलर नियंत्रण संरचनाओं if, for, switch वाले कोड ब्लॉक को बिल्डर की स्थैतिक विधियों — buildBlock, buildEither, buildArray — के कॉल में बदल देता है। Swift Evolution प्रस्ताव SE-0289 (2022) के अनुसार, result builders बाहरी पार्सर्स के बिना Swift के अंदर घोषणात्मक DSL बनाने की अनुमति देते हैं। सबसे प्रसिद्ध उदाहरण SwiftUI में @ViewBuilder है, जहाँ व्यू का बॉडी सशर्त और चक्रीय तत्वों से घोषणात्मक शैली में बनाया जाता है।

मुख्य निष्कर्ष

  • Result Builder — एक Swift विशेषता जो बिल्डर की स्थैतिक विधियों के माध्यम से अभिव्यक्तियों के अनुक्रम को परिणामी मान में बदलती है
  • @ViewBuilder — सबसे प्रसिद्ध उदाहरण: यह कई व्यू को एक समग्र प्रस्तुति TupleView में रूपांतरित करता है
  • नियंत्रण संरचनाएँ — बिल्डर if/else, switch, for-in को विधियों buildOptional, buildEither, buildArray के माध्यम से समर्थन करता है
  • कस्टम बिल्डर आपके अपने DSL — HTML, CSS, कॉन्फ़िगरेशन, क्वेरी के लिए बनाए जा सकते हैं
  • Swift 5.4 ने result builders के समर्थन को फंक्शन और फंक्शन पैरामीटर तक बढ़ाया — अब आप बिल्डर को क्लोज़र आर्गुमेंट पर लागू कर सकते हैं

Result Builder क्या है?

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 घटक — अनिवार्य असेंबली कोड लिखे बिना।

Result Builder कैसे काम करता है

Swift कंपाइलर @resultBuilder से चिह्नित प्रत्येक कोड ब्लॉक को बिल्डर की स्थैतिक विधियों के कॉल के अनुक्रम में बदल देता है। आइए एक सरल बिल्डर देखें जो स्ट्रिंग को जोड़ता है:

swift
@resultBuilder
struct StringBuilder {
    static func buildBlock(_ parts: String...) -> String {
        parts.joined(separator: " ")
    }
}

इस बिल्डर का उपयोग — प्रत्येक स्ट्रिंग एक अलग लाइन पर एक स्थान के साथ जुड़ती है:

swift
@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 कोड कॉल की एक श्रृंखला में बदल जाता है जो अंतिम मान का निर्माण करती है।

बिल्डर की विधियाँ: buildBlock, buildOptional, buildEither

प्रत्येक result builder स्थैतिक विधियों का एक सेट परिभाषित करता है जिसे कंपाइलर रूपांतरण के दौरान कॉल करता है। मुख्य विधियाँ:

विधिउद्देश्यकब कॉल होती है
buildBlockअभिव्यक्तियों के अनुक्रम को जोड़ता हैप्रत्येक ब्लॉक के लिए बिना शाखाकरण के
buildOptionalif को बिना else के संभालता हैजब if बिना else के हो
buildEither(first:)if-else की पहली शाखाif के साथ else पर
buildEither(second:)if-else की दूसरी शाखाif के साथ else पर
buildArrayfor-in लूप को संभालता हैजब for-in मौजूद हो
buildExpressionव्यक्तिगत अभिव्यक्तियों को रूपांतरित करता हैप्रत्येक अभिव्यक्ति के लिए buildBlock में पास करने से पहले
buildFinalResultअंतिम रूपांतरणक्लोज़र से लौटने से पहले

न्यूनतम कार्यान्वयन के लिए केवल वेरिएडिक पैरामीटर के साथ buildBlock की आवश्यकता है — यह बिना शाखाकरण वाले ब्लॉक के लिए पर्याप्त है। buildOptional और buildEither जोड़ने से सशर्त संरचनाओं का समर्थन शामिल होता है, और buildArray लूप का। Swift दस्तावेज़ीकरण (2025) के अनुसार, अधिकतम DSL लचीलेपन के लिए सभी विधियों को कार्यान्वित करने की अनुशंसा की जाती है।

buildExpression विभिन्न प्रकारों की अभिव्यक्तियों को स्वीकार करने और उन्हें एकल बिल्डर प्रकार में बदलने की अनुमति देता है। उदाहरण के लिए, @ViewBuilder में, buildExpression Text, Image, Button को स्वीकार करता है और उन्हें सामान्य View प्रकार में बदल देता है।

कस्टम Result Builder बनाना

आइए HTML स्ट्रिंग बनाने के लिए एक बिल्डर बनाने पर विचार करें। यह DSL सीधे Swift में घोषणात्मक HTML लिखने की अनुमति देगा:

swift
@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 जनरेट करने के लिए कस्टम बिल्डर का उपयोग:

swift
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 घटक, डेटा मैपिंग, और यहाँ तक कि डेटाबेस क्वेरी बनाने के लिए किया जाता है — हर जगह जहाँ शाखाकरण समर्थन के साथ घोषणात्मक सिंटैक्स की आवश्यकता होती है।

SwiftUI में @ViewBuilder

@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 के माध्यम से प्रकार विलोपन का उपयोग करता है।

swift
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 — का चयन करता है।

Result Builder की सीमाएँ

पहली सीमा buildBlock में अभिव्यक्तियों की अधिकतम संख्या है। Swift मानक पुस्तकालय 2–10 अभिव्यक्तियों के लिए buildBlock के ओवरलोड को परिभाषित करता है। यदि किसी ब्लॉक में 10 से अधिक अभिव्यक्तियाँ हैं, तो कंपाइलर एक त्रुटि उत्पन्न करेगा। समाधान — उप-ब्लॉक में विभाजित करने के लिए Group या VStack के माध्यम से समूहीकरण।

दूसरी सीमा बिल्डर ब्लॉक के अंदर चर और असाइनमेंट के समर्थन की कमी है। @ViewBuilder के अंदर let x = 5 घोषित नहीं किया जा सकता। सभी अभिव्यक्तियाँ ऐसी अभिव्यक्तियाँ होनी चाहिए जो बिल्डर प्रकार का मान लौटाती हैं। मध्यवर्ती गणनाओं के लिए, बिल्डर के बाहर गणनाएँ या विभिन्न प्रकारों के समर्थन के साथ buildExpression का उपयोग करें।

तीसरी सीमा डीबगिंग की जटिलता है। Result builder के अंदर संकलन त्रुटियाँ अक्सर भ्रामक संदेश देती हैं, विशेषकर जब if/else शाखाओं में प्रकार मेल नहीं खाते। डीबगिंग के लिए स्पष्ट रिटर्न प्रकार और AnyView का उपयोग करें, हालाँकि बाद वाला प्रदर्शन को कम करता है। Hacking with Swift (2025) के अनुसार, व्यावहारिक सुझाव — बिना शाखाकरण के एक सरल बिल्डर से शुरू करें और धीरे-धीरे सशर्त संरचनाओं का समर्थन जोड़ें।

अक्सर पूछे जाने वाले प्रश्न

Swift में Result Builder क्या है?

Result Builder एक Swift विशेषता है जो स्थैतिक विधियों के माध्यम से अभिव्यक्तियों के अनुक्रम को परिणामी मान में बदलती है। यह घोषणात्मक DSL बनाने की अनुमति देता है, सबसे प्रसिद्ध उदाहरण SwiftUI में @ViewBuilder है जो अनिवार्य कोड के बिना व्यू पदानुक्रम बनाने के लिए है।

अपना खुद का Result Builder कैसे बनाएँ?

@resultBuilder विशेषता वाली एक संरचना घोषित करें और कम से कम buildBlock विधि को कार्यान्वित करें। शर्तों के समर्थन के लिए buildOptional और buildEither जोड़ें; लूप के लिए buildArray जोड़ें। फ़ंक्शन में क्लोज़र पैरामीटर से पहले बिल्डर विशेषता का उपयोग करें।

Result Builder के लिए कौन सी विधियाँ अनिवार्य हैं?

केवल buildBlock अनिवार्य है। अन्य सभी विधियाँ — buildOptional, buildEither, buildArray, buildExpression, buildFinalResult — वैकल्पिक हैं और संबंधित संरचनाओं का समर्थन जोड़ती हैं। जितनी अधिक विधियाँ कार्यान्वित की जाती हैं, DSL उतना ही लचीला होता है।

@ViewBuilder Result Builder क्यों है?

@ViewBuilder View प्रोटोकॉल के लिए result builder का एक ठोस कार्यान्वयन है। इसे SwiftUI में @resultBuilder विशेषता वाली संरचना के रूप में परिभाषित किया गया है, जो विभिन्न संख्याओं के व्यू (TupleView) के लिए buildBlock विधियाँ, ConditionalContent के लिए buildEither और ForEach के लिए buildArray प्रदान करता है।

क्या बिल्डर में अभिव्यक्तियों की संख्या की कोई सीमा है?

हाँ, मानक buildBlock ओवरलोड 10 अभिव्यक्तियों तक का समर्थन करते हैं। इससे अधिक होने पर, उप-ब्लॉक में विभाजित करने के लिए नेस्टेड कंटेनर (Group, VStack) का उपयोग करें। एक कस्टम बिल्डर बिना सीमा के वेरिएडिक buildBlock परिभाषित कर सकता है।

सारांश

  • Result Builder — एक Swift विशेषता जो बिल्डर की स्थैतिक विधियों के माध्यम से अभिव्यक्तियों के अनुक्रम को एक एकल मान में बदलती है
  • कंपाइलर नियंत्रण संरचनाओं के आधार पर कोड ब्लॉक को buildBlock, buildEither, buildOptional, buildArray के कॉल से बदल देता है
  • @ViewBuilder — SwiftUI का अंतर्निर्मित result builder जो शर्तों और लूप के समर्थन के साथ घोषणात्मक व्यू पदानुक्रम कोड लिखने की अनुमति देता है
  • कस्टम बिल्डर DSL बनाने के लिए उपयोग किए जाते हैं: HTML, कॉन्फ़िगरेशन, क्वेरी — कोई भी संरचना जो घोषणात्मक सिंटैक्स से लाभ उठाती है
  • सीमाएँ: buildBlock में अधिकतम 10 अभिव्यक्तियाँ, चर घोषित नहीं किए जा सकते, प्रकार बेमेल होने पर भ्रामक संकलन त्रुटियाँ
  • Swift 5.4+ — बिल्डर को फ़ंक्शन पैरामीटर पर लागू किया जा सकता है, जो व्यू बॉडी से परे उपयोग के मामलों का विस्तार करता है

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें