Result Builder — bu nədir, sintaksisi və tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-06-20 Oxuma vaxtı: 8 dəq

Result Builder — Swift atributu olub, @resultBuilder protokolu vasitəsilə tətbiq edilir və ifadələr ardıcıllığını mürəkkəb dəyərə çevirir. Kompilyator if, for, switch idarəetmə konstruksiyaları olan kod bloklarını builder’ın statik metodlarına — buildBlock, buildEither, buildArray çevirir. Swift Evolution təklifi SE-0289-a (2022) görə, result builder’lar xarici parsersiz Swift daxilində deklarativ DSL yaratmağa imkan verir. Ən məşhur nümunə — SwiftUI’də @ViewBuilder — view gövdəsinin şərti və dövri elementlərlə deklarativ üslubda qurulmasıdır.

Başlıca

  • Result Builder — Swift atributu olub, ifadələr ardıcıllığını builder’ın statik metodları vasitəsilə nəticə dəyərinə çevirir
  • @ViewBuilder — ən məşhur nümunə: bir neçə view’i bir mürəkkəb təmsilçiliyə TupleView çevirir
  • İdarəetmə konstruksiyaları — builder if/else, switch, for-in üçün buildOptional, buildEither, buildArray metodlarını dəstəkləyir
  • Xüsusi builder’lar öz DSL-ləriniz üçün yaradıla bilər — HTML, CSS, konfiqurasiyalar, sorğular
  • Swift 5.4 result builder’ların dəstəyini funksiyalara və funksiya parametrlərinə genişləndirdi — indi builder closure arqumentinə tətbiq edilə bilər

Result Builder nədir?

Result Builder (əvvəllər function builders kimi tanınır) — Swift mexanizmi olub, yeni sətr ilə ayrılmış ifadələr ardıcıllığını vahid dəyərə çevirməyə imkan verir. Statik çevirmə metodlarını héyata keçirən struktura tətbiq edilən @resultBuilder atributu ilə elan edilir.

Result builder’lar yaranana qədər SwiftUI body’nin deklarativ sintaksisi mümkün deyildi. Yığcam view siyahısı əvəzinə, proqramçı əl ilə TupleView çağırışları yazmalı idi. Result Builder avtomatik olaraq hər ifadəni sarır, budaqlanma və dövrləri dəstəkləyir, kompozisiya mürəkkəbliyini proqramçıdan gizlədir.

2022-ci ildə qəbul edilmiş Swift Evolution SE-0289-a görə, result builder function builders ideyasının inkişafıdır (SE-0258, Swift 5.1). Əsas dəyişikliklər: @_functionBuilder adının @resultBuilder olaraq dəyişdirilməsi və funksiya parametrlərinə genişləndirilməsi — builder’ların yalnız view gövdəsi üçün deyil, istənilən closure arqumenti üçün istifadəsinə imkan verdi.

Kitabxananızın istifadəçilərinə mürəkkəb strukturlar — konfiqurasiyalar, sorğular, UI komponentləri — qurmaq üçün imperativ yığma kodu yazmadan deklarativ sintaksis təqdim etmək istədikdə result builder’lardan istifadə edin.

Result Builder necə işləyir

Swift kompilyatoru @resultBuilder ilə işərələnmiş hər kod blokunu builder’ın statik metodlarının çağırışları ardıcıllığına çevirir. Sətrləri birləşdirən ən sadə builder’ı nəzərdən keçirək:

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

Bu builder’ın istifadəsi — hər sətr ayrıca sətirdə boşluq vasitəsilə birləşdirilir:

swift
@StringBuilder
func greeting() -> String {
    "Hello"
    "World"
    "from"
    "Swift"
}
// Kompilyator bunu çevirir:
// StringBuilder.buildBlock("Hello", "World", "from", "Swift")
// Nəticə: "Hello World from Swift"

Kompilyator ardıcıl ifadələri qruplaşdırır və onları buildBlock’a variadic parametr kimi ötürür. Əgər ifadələr arasında if varsa, kompilyator budaqlanma üçün buildOptional və ya buildEither çağırır. for-in dövrləri üçün buildArray çağırılır. Beləliklə, adi Swift kodu yekun dəyəri quran çağırışlar zəncirinə çevrilir.

Builder metodları: buildBlock, buildOptional, buildEither

Hər result builder çevirmə zamanı kompilyatorun çağırdığı statik metodlar toplusunu təyin edir. Əsas metodlar:

MetodTəyinatNə vaxt çağırılır
buildBlockİfadələr ardıcıllığını birləşdirirBudaqlanmasız hər blok üçün
buildOptionalElse’siz if-i emal edirif else olmadan olduqda
buildEither(first:)If-else birinci budağıif else ilə olduqda
buildEither(second:)If-else ikinci budağıif else ilə olduqda
buildArrayFor-in dövrünü emal edirfor-in olduqda
buildExpressionAyrıca ifadəni çevirirHər ifadə üçün buildBlock’a ötürməzdən əvvəl
buildFinalResultYekun çevirməClosure’dan qayıtmazdan əvvəl

Minimal tətbiq yalnız variadic parametrləri olan buildBlock tələb edir — bu budaqlanmasız bloklar üçün kifayətdir. buildOptionalbuildEither’ın əlavə edilməsi şərti konstruksiyaların dəstəyini, buildArray isə dövrlərin dəstəyini aktivləşdirir. Swift Documentation (2025)-a görə, DSL-in maksimum elastikliyi üçün bütün metodların tətbiqi tövsiyə olunur.

buildExpression müxtəlif tipli ifadələri qəbul etməyə və onları builder’ın vahid tipinə çevirməyə imkan verir. Məsələn, @ViewBuilder’da buildExpression Text, Image, Button qəbul edir və onları ümumi View tipinə gətirir.

Xüsusi Result Builder yaratmaq

HTML sətrləri qurmaq üçün builder yaratmağı nəzərdən keçirək. Bu DSL birbaşa Swift’də deklarativ HTML yazmağa imkan verəcək:

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 yaratmaq üçün xüsusi builder’ın istifadəsi:

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("Altbilgi")
    }
}
// Nəticə: <div><p>Hello</p><p>World</p><p>Footer</p></div>

Swift.org (2025) tərəfindən “Building Custom Result Builders in Swift” məqaləsinə görə, xüsusi builder’lar konfiqurasiya faylları, UI komponentləri, məlumatların xəritələnməsi və hətta verilənlər bazası sorğuları qurmaq üçün kitabxanalarda istifadə olunur — budaqlanma dəstəyi ilə deklarativ sintaksisin lazım olduğu hər yerdə.

SwiftUI’də @ViewBuilder

@ViewBuilder — SwiftUI’yə daxil edilmiş result builder olub, əksər konteyner view-lərin content parametrinə tətbiq edilir: VStack, HStack, ZStack, Group, Listbody xassəsinin özünə. Vergül və sarıcılar olmadan ayrı-ayrı sətrlərdə bir neçə view yazmağa imkan verir.

@ViewBuilder if-else, switchfor-in dəstəyi daxil olmaqla bütün result builder metodlarını tətbiq edir. Şərt yerinə yetirildikdə, buildEither(first:) bir view qaytarır; yerinə yetirilmədikdə — buildEither(second:) başqa bir view qaytarır. Hər iki budaq eyni tipi qaytarmalıdır, lakin SwiftUI daxildə AnyView və ya ConditionalContent vasitəsilə tip silmədən istifadə edir.

swift
struct GreetingView: View {
    let isLoggedIn: Bool

    var body: some View {
        VStack {
            Image(systemName: "person.circle")
            Text("Profil")
                .font(.title)

            if isLoggedIn {
                Text("Xoş gəldiniz!")
                    .foregroundColor(.green)
            } else {
                Button("Daxil ol") { }
            }
        }
    }
}

@ViewBuilder olmadan eyni kod hər şərti bölmə üçün Group və ya AnyView istifadəsini tələb edərdi ki, bu da performansı pisləşdirir. @ViewBuilder avtomatik olaraq hər kombinasiya üçün ən səmərəli təmsilçiliyi — ConditionalContent və ya TupleView — seçir.

Result Builder məhdudiyyətləri

Birinci məhdudiyyət — buildBlock’da maksimum ifadə sayı. Swift standart kitabxanası buildBlock üçün 2–10 ifadə üçün yüklənmələr təyin edir. Blokda 10-dan çox ifadə varsa, kompilyator xəta verir. Həll — alt bloklara bölmək üçün Group və ya VStack vasitəsilə qruplaşdırma.

İkinci məhdudiyyət — builder bloku daxilində dəyişən və təyinatların dəstəklənməməsi. @ViewBuilder daxilində let x = 5 elan etmək olmaz. Bütün ifadələr builder tipinin dəyərini qaytaran ifadələr olmalıdır. Aralıq hesablamalar üçün builder xaricində hesablamalardan və ya müxtəlif tipləri dəstəkləyən buildExpression’dan istifadə edin.

Üçüncü məhdudiyyət — sazlamanın çətinliyi. Result builder daxilində kompilyasiya xətaları çox vaxt çaşbash mesajları verir, xüsusilə if/else budaqlarında tip uyğunsuzluğu olduqda. Sazlama üçün açıq qaytarılan tiplərdən və AnyView’dan istifadə edin, baxmayaraq ki, sonuncu performansı aşağı salır. Hacking with Swift (2025)-a görə, praktik məsləhət — budaqlanmasız sadə builder’la başlayın və şərti konstruksiyaların dəstəyini tədricən əlavə edin.

Tez-tez verilən suallar

Swift’də Result Builder nədir?

Result Builder — Swift atributu olub, ifadələr ardıcıllığını statik metodlar vasitəsilə nəticə dəyərinə çevirir. Deklarativ DSL yaratmağa imkan verir, ən məşhur nümunə — SwiftUI’də imperativ kod olmadan view iyerarxiyası qurmaq üçün @ViewBuilder.

Öz Result Builder’ımı necə yarada bilərəm?

@resultBuilder atributu ilə struktur elan edin və ən azı buildBlock metodunu tətbiq edin. Şərtləri dəstəkləmək üçün buildOptionalbuildEither əlavə edin, dövrlər üçün — buildArray. Builder atributunu funksiyadakı closure parametrindən əvvəl istifadə edin.

Result Builder üçün hansı metodlar məcburidir?

Yalnız buildBlock məcburidir. Qalan metodlar — buildOptional, buildEither, buildArray, buildExpression, buildFinalResult — isteğə bağlıdır və müvafiq konstruksiyaların dəstəyini əlavə edir. Nə qədər çox metod tətbiq edilərsə, DSL bir o qədər elastik olar.

Niyə @ViewBuilder Result Builder’dır?

@ViewBuilder — View protokolu üçün result builder’ın konkret tətbiqidir. SwiftUI’də @resultBuilder atributlu struktur kimi təyin edilmişdir, müxtəlif sayda view (TupleView) üçün buildBlock, ConditionalContent üçün buildEither və ForEach üçün buildArray metodlarını təmin edir.

Builder’da ifadə sayına məhdudiyyət varmı?

Bəli, standart buildBlock yüklənmələri 10 ifadəyə qədər dəstəkləyir. Həddi aşdıqda alt bloklara bölmək üçün iç-içə konteynerlərdən (Group, VStack) istifadə edin. Xüsusi builder məhdudiyyətsiz variadic buildBlock təyin edə bilər.

Nəticə

  • Result Builder — Swift atributu olub, ifadələr ardıcıllığını builder’ın statik metodları vasitəsilə vahid dəyərə çevirir
  • Kompilyator idarəetmə konstruksiyalarından asılı olaraq kod blokunu buildBlock, buildEither, buildOptional, buildArray çağırışları ilə əvəz edir
  • @ViewBuilder — SwiftUI’yə daxil edilmiş result builder olub, şərtlər və dövrlər dəstəyi ilə view iyerarxiyasının deklarativ kodunu yazmağa imkan verir
  • Xüsusi builder’lar DSL qurmaq üçün istifadə olunur: HTML, konfiqurasiyalar, sorğular — deklarativ sintaksisdən faydalanan istənilən struktur
  • Məhdudiyyətlər: buildBlock’da maks. 10 ifadə, dəyişən elan etmək mümkünsüz, tip uyğunsuzluğunda çaşbash kompilyasiya xətaları
  • Swift 5.4+ — builder’lar funksiya parametrlərinə tətbiq edilə bilər ki, bu da istifadə ssenarilərini view gövdəsindən kənara genişləndirir

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun