Result Builder — nedir, sözdizimi ve kullanımı

Yazar: IT Sectr Yayınlanma: 2026-06-20 Okuma süresi: 8 dk

Result Builder, @resultBuilder protokolü aracılığıyla uygulanan ve bir ifadeler dizisini bileşik bir değere dönüştüren bir Swift özelliğidir. Derleyici, if, for, switch kontrol yapılarını içeren kod bloklarını builder'ın statik yöntemlerine — buildBlock, buildEither, buildArray — dönüştürür. Swift Evolution teklifi SE-0289* (2022) göre result builders, harici ayrıştırıcılar olmadan Swift içinde bildirimsel DSL'ler oluşturmaya olanak tanır. En bilinen örnek, SwiftUI'deki @ViewBuilder'dır; burada görünüm gövdesi, bildirimsel bir tarzda koşullu ve döngüsel öğelerden oluşturulur.

Önemli Noktalar

  • Result Builder — builder'ın statik yöntemleri aracılığıyla bir ifadeler dizisini sonuç değerine dönüştüren bir Swift özelliği
  • @ViewBuilder — en bilinen örnek: birden çok görünümü tek bir bileşik temsile TupleView dönüştürür
  • Kontrol yapıları — builder, if/else, switch, for-in yapılarını buildOptional, buildEither, buildArray yöntemleri aracılığıyla destekler
  • Özel builder'lar kendi DSL'leriniz için oluşturulabilir — HTML, CSS, yapılandırma, sorgular
  • Swift 5.4, result builders desteğini işlevlere ve işlev parametrelerine genişletti — artık bir builder'ı closure argümanına uygulayabilirsiniz

Result Builder nedir?

Result Builder (önceden function builders olarak bilinir), satır sonlarıyla ayrılmış bir ifadeler dizisini tek bir değere dönüştürmeye izin veren bir Swift mekanizmasıdır. Statik dönüştürme yöntemlerini uygulayan bir yapıya uygulanan @resultBuilder özelliği kullanılarak bildirilir.

Result builders'dan önce SwiftUI body'nin bildirimsel söz dizimi imkansızdı. Görünümlerin kompakt bir listesi yerine, geliştiricilerin manuel olarak TupleView çağrıları yazması gerekirdi. Result Builder otomatik olarak her ifadeyi sarar, dallanma ve döngüleri destekler, geliştiriciden kompozisyonun karmaşıklığını gizler.

2022'de kabul edilen Swift Evolution SE-0289* göre result builder, function builders (SE-0258, Swift 5.1) fikrinin bir evrimidir. Temel değişiklikler: @_functionBuilder'dan @resultBuilder'a yeniden adlandırma ve işlev parametrelerine genişletme, builder'ların yalnızca görünüm gövdeleri için değil herhangi bir closure argümanı için kullanılmasına olanak tanır.

Kitaplığınızın kullanıcılarına karmaşık yapılar (yapılandırmalar, sorgular, UI bileşenleri) oluşturmak için bildirimsel bir söz dizimi sağlamanız gerektiğinde result builders kullanın — imperatif derleme kodu yazmadan.

Result Builder nasıl çalışır

Swift derleyicisi, @resultBuilder ile işaretlenmiş her kod bloğunu builder'ın statik yöntemlerine yapılan çağrılar dizisine dönüştürür. Dizeleri birleştiren basit bir builder'a bakalım:

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

Bu builder'ı kullanma — her dize ayrı bir satırda bir boşlukla birleştirilir:

swift
@StringBuilder
func greeting() -> String {
    "Hello"
    "World"
    "from"
    "Swift"
}
// Derleyici bunu dönüştürür:
// StringBuilder.buildBlock("Hello", "World", "from", "Swift")
// Sonuç: "Hello World from Swift"

Derleyici ardışık ifadeleri gruplar ve bunları değişken parametreler olarak buildBlock'a iletir. İfadeler arasında bir if görünürse, derleyici dallanma için buildOptional veya buildEither'ı çağırır. for-in döngüleri için buildArray'i çağırır. Böylece sıradan Swift kodu, nihai değeri oluşturan bir çağrı zincirine dönüştürülür.

Builder yöntemleri: buildBlock, buildOptional, buildEither

Her result builder, derleyicinin dönüştürme sırasında çağırdığı bir dizi statik yöntem tanımlar. Ana yöntemler:

YöntemAmaçNe zaman çağrılır
buildBlockBir ifadeler dizisini birleştirirDallanma olmayan her blok için
buildOptionalelse'siz if'i işlerif else olmadan olduğunda
buildEither(first:)if-else'in ilk dalıif else ile olduğunda
buildEither(second:)if-else'in ikinci dalıif else ile olduğunda
buildArrayfor-in döngülerini işlerfor-in mevcut olduğunda
buildExpressionBireysel ifadeleri dönüştürürHer ifade için buildBlock'a geçirmeden önce
buildFinalResultSon dönüşümClosure'dan dönmeden önce

Minimum bir uygulama yalnızca değişken parametrelerle buildBlock gerektirir — bu dallanma olmayan bloklar için yeterlidir. buildOptional ve buildEither eklemek koşullu yapılar için destek içerir ve buildArray döngüler için. Swift Belgeleri'ne (2025) göre, maksimum DSL esnekliği için tüm yöntemlerin uygulanması önerilir.

buildExpression, farklı türlerdeki ifadeleri kabul etmeye ve bunları tek bir builder türüne dönüştürmeye olanak tanır. Örneğin, @ViewBuilder'da buildExpression, Text, Image, Button'ı kabul eder ve bunları ortak View türüne dönüştürür.

Özel Result Builder oluşturma

HTML dizeleri oluşturmak için bir builder oluşturmayı ele alalım. Bu DSL, doğrudan Swift'te bildirimsel HTML yazmaya izin verecektir:

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 oluşturmak için özel builder kullanımı:

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("Alt bilgi")
    }
}
// Sonuç: <div><p>Hello</p><p>World</p><p>Footer</p></div>

Swift.org (2025) “Building Custom Result Builders in Swift” makalesine göre, özel builder'lar yapılandırma dosyaları, UI bileşenleri, veri eşleme ve hatta veritabanı sorguları oluşturmak için kitaplıklarda kullanılır — dallanma desteğiyle bildirimsel sözdiziminin gerekli olduğu her yerde.

SwiftUI'de @ViewBuilder

@ViewBuilder, SwiftUI'ye yerleşik bir result builder'dır ve çoğu kapsayıcı görünümün content parametresine uygulanır: VStack, HStack, ZStack, Group, List ve body özelliğinin kendisi. Virgül veya sarmalayıcı olmadan ayrı satırlarda birden çok görünüm yazmaya olanak tanır.

@ViewBuilder, if-else, switch ve for-in desteği dahil tüm result builder yöntemlerini uygular. Bir koşul doğru olduğunda, buildEither(first:) bir görünüm döndürür; yanlış olduğunda, buildEither(second:) başka bir görünüm döndürür. Her iki dal da aynı türü döndürmelidir, ancak SwiftUI dahili olarak AnyView veya ConditionalContent aracılığıyla tür silme kullanır.

swift
struct GreetingView: View {
    let isLoggedIn: Bool

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

            if isLoggedIn {
                Text("Tekrar hoş geldiniz!")
                    .foregroundColor(.green)
            } else {
                Button("Giriş Yap") { }
            }
        }
    }
}

@ViewBuilder olmadan, aynı kod her koşullu bölüm için Group veya AnyView kullanımını gerektirir, bu da performansı düşürür. @ViewBuilder her kombinasyon için en verimli temsili — ConditionalContent veya TupleView — otomatik olarak seçer.

Result Builder sınırlamaları

İlk sınırlama, buildBlock'taki maksimum ifade sayısıdır. Swift standart kitaplığı, 2–10 ifade için buildBlock aşırı yüklemeleri tanımlar. Bir blokta 10'dan fazla ifade varsa, derleyici bir hata üretir. Çözüm, alt bloklara bölmek için Group veya VStack aracılığıyla gruplamadır.

İkinci sınırlama, builder bloğu içinde değişkenlerin ve atamaların desteklenmemesidir. @ViewBuilder içinde let x = 5 bildiremezsiniz. Tüm ifadeler, builder türünde bir değer döndüren ifadeler olmalıdır. Ara hesaplamalar için, builder dışında hesaplamalar veya farklı türleri destekleyen buildExpression kullanın.

Üçüncü sınırlama, hata ayıklama karmaşıklığıdır. Bir result builder içindeki derleme hataları, özellikle if/else dallarında türler uyuşmadığında kafa karıştırıcı mesajlar üretir. Hata ayıklama için açık dönüş türleri ve AnyView kullanın, ancak ikincisi performansı düşürür. Hacking with Swift (2025)'e göre pratik bir ipucu — dallanma olmayan basit bir builder ile başlayın ve kademeli olarak koşullu yapı desteği ekleyin.

Sıkça Sorulan Sorular

Swift'te Result Builder nedir?

Result Builder, statik yöntemler aracılığıyla bir ifadeler dizisini sonuç değerine dönüştüren bir Swift özelliğidir. Bildirimsel DSL'ler oluşturmaya olanak tanır, en bilinen örnek imperatif kod olmadan görünüm hiyerarşileri oluşturmak için SwiftUI'deki @ViewBuilder'dır.

Kendi Result Builder'ımı nasıl oluştururum?

@resultBuilder özelliğine sahip bir yapı bildirin ve en azından buildBlock yöntemini uygulayın. Koşulları desteklemek için buildOptional ve buildEither ekleyin; döngüler için buildArray ekleyin. Bir işlevde closure parametresinden önce builder özelliğini kullanın.

Result Builder için hangi yöntemler zorunludur?

Yalnızca buildBlock zorunludur. Diğer tüm yöntemler — buildOptional, buildEither, buildArray, buildExpression, buildFinalResult — isteğe bağlıdır ve ilgili yapılar için destek ekler. Ne kadar çok yöntem uygulanırsa, DSL o kadar esnek olur.

@ViewBuilder neden bir Result Builder'dır?

@ViewBuilder, View protokolü için result builder'ın somut bir uygulamasıdır. SwiftUI'de @resultBuilder özelliğine sahip bir yapı olarak tanımlanır, farklı sayıda görünüm için buildBlock yöntemleri (TupleView), ConditionalContent için buildEither ve ForEach için buildArray sağlar.

Bir builder'daki ifade sayısında bir sınır var mı?

Evet, standart buildBlock aşırı yüklemeleri 10 ifadeye kadar destekler. Bunu aştığınızda, alt bloklara bölmek için iç içe kapsayıcılar (Group, VStack) kullanın. Özel bir builder, sınırlama olmaksızın değişken buildBlock tanımlayabilir.

Özet

  • Result Builder — builder'ın statik yöntemleri aracılığıyla bir ifadeler dizisini tek bir değere dönüştüren bir Swift özelliği
  • Derleyici kontrol yapılarına bağlı olarak bir kod bloğunu buildBlock, buildEither, buildOptional, buildArray çağrılarıyla değiştirir
  • @ViewBuilder — koşullar ve döngüler desteğiyle bildirimsel görünüm hiyerarşisi kodu yazmaya olanak tanıyan SwiftUI'nin yerleşik result builder'ı
  • Özel builder'lar DSL oluşturmak için kullanılır: HTML, yapılandırmalar, sorgular — bildirimsel sözdiziminden faydalanan herhangi bir yapı
  • Sınırlamalar: buildBlock'ta maksimum 10 ifade, değişken bildirilemez, tür uyuşmazlığında kafa karıştırıcı derleme hataları
  • Swift 5.4+ — builder'lar işlev parametrelerine uygulanabilir, kullanım durumlarını görünüm gövdelerinin ötesine genişletir

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun