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
TupleView çeviririf/else, switch, for-in üçün buildOptional, buildEither, buildArray metodlarını dəstəkləyirResult 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.
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:
@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:
@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.
Hər result builder çevirmə zamanı kompilyatorun çağırdığı statik metodlar toplusunu təyin edir. Əsas metodlar:
| Metod | Təyinat | Nə vaxt çağırılır |
|---|---|---|
| buildBlock | İfadələr ardıcıllığını birləşdirir | Budaqlanmasız hər blok üçün |
| buildOptional | Else’siz if-i emal edir | if else olmadan olduqda |
| buildEither(first:) | If-else birinci budağı | if else ilə olduqda |
| buildEither(second:) | If-else ikinci budağı | if else ilə olduqda |
| buildArray | For-in dövrünü emal edir | for-in olduqda |
| buildExpression | Ayrıca ifadəni çevirir | Hər ifadə üçün buildBlock’a ötürməzdən əvvəl |
| buildFinalResult | Yekun ç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. buildOptional və buildEither’ı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.
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:
@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:
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ə.
@ViewBuilder — SwiftUI’yə daxil edilmiş result builder olub, əksər konteyner view-lərin content parametrinə tətbiq edilir: VStack, HStack, ZStack, Group, List və body 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, switch və for-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.
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.
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
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.
@resultBuilder atributu ilə struktur elan edin və ən azı buildBlock metodunu tətbiq edin. Şərtləri dəstəkləmək üçün buildOptional və buildEither əlavə edin, dövrlər üçün — buildArray. Builder atributunu funksiyadakı closure parametrindən əvvəl istifadə edin.
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.
@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.
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ə
buildBlock, buildEither, buildOptional, buildArray çağırışları ilə əvəz edirAç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.
Həm də oxuyun