SwiftUI: apa itu, konsep kunci dan View Protocol

Penulis: IT Sectr Diterbitkan: 2026-04-30 Waktu membaca: 8 mnt

SwiftUI adalah framework deklaratif dari Apple untuk membangun antarmuka pengguna di semua platform ekosistem. Alih-alih mendeskripsikan langkah-langkah secara imperatif, pengembang mendeklarasikan bagaimana antarmuka seharusnya terlihat, dan SwiftUI menangani rendering dan pembaruannya. Menurut Apple Developer Documentation (2025), SwiftUI mendukung iOS 15+, iPadOS 15+, macOS 12+, watchOS 8+ dan tvOS 15+ dan menggunakan View Protocol sebagai blok bangunan dasar untuk semua komponen antarmuka.

Poin Utama

  • SwiftUI — framework deklaratif Apple di mana pengembang mendeskripsikan antarmuka dan pembaruan dilakukan secara otomatis.
  • View Protocol dengan properti body — dasar dari setiap komponen UI SwiftUI, mengembalikan deskripsi layar melalui komposisi view.
  • Property Wrappers — @State, @Binding, @ObservedObject, @StateObject — mengelola status dan memicu penggambaran ulang saat data berubah.
  • NavigationStack (iOS 16+) — API navigasi modern dengan rute yang aman tipe dan transisi deklaratif.
  • Modifier — rangkaian panggilan untuk mengonfigurasi tampilan dan perilaku view tanpa pewarisan kelas.

Apa itu SwiftUI?

SwiftUI adalah framework deklaratif, diperkenalkan oleh Apple pada tahun 2019 untuk menggantikan UIKit dalam proyek-proyek baru. Alih-alih membuat instance UIView secara manual dan menambahkannya ke hierarki, pengembang mendeskripsikan antarmuka melalui struktur yang mengimplementasikan protokol View. SwiftUI secara otomatis menghitung perbedaan antara status saat ini dan yang baru dan hanya menggambar ulang bagian yang berubah, menggunakan mesin rendering miliknya sendiri.

Framework ini ditulis dalam Swift menggunakan value semantics (struktur, bukan kelas), yang membuat komponen UI menjadi ringan dan thread-safe. Tidak seperti UIKit, di mana UIViewController dapat berbobot 200+ byte karena runtime Objective-C, View SwiftUI hanyalah sebuah struktur berukuran beberapa byte. Ini sangat penting untuk watchOS dengan memorinya yang terbatas.

Lintas Platform SwiftUI

Deskripsi View yang sama berfungsi di iPhone, iPad, Mac, Apple Watch, Apple TV, dan Apple Vision Pro. SwiftUI menyesuaikan antarmuka dengan platform: di iOS — gerakan sentuh, di macOS — pintasan keyboard, di watchOS — pengguliran Digital Crown. Ini mempercepat waktu pengembangan bagi perusahaan yang merilis aplikasi di beberapa platform Apple, tetapi memerlukan konfigurasi tambahan untuk elemen spesifik setiap platform.

View Protocol dan tubuh tampilan

Di SwiftUI, setiap layar adalah struktur yang mengimplementasikan protokol View dengan satu persyaratan: properti terkomputasi body bertipe some View. Kata kunci some (opaque type) menyembunyikan tipe konkret view, memungkinkan SwiftUI mengoptimalkan rendering. Di dalam body, pengembang menggabungkan komponen siap pakai — Text, Image, Button, List — menggunakan ViewBuilder, yang mengumpulkan beberapa view menjadi satu.

swift
struct GreetingView: View {
    let name: String

    var var body: some View {
        VStack {
            Text("Halo, \(name)!")
                .font(.title)
                .foregroundColor(.blue)
            Image(systemName: "hand.wave")
                .imageScale(.large)
        }
        .padding()
    }
}

Dalam contoh, VStack (tumpukan vertikal) berisi Text dan Image. Nilai name diteruskan melalui inisialisasi struktur — begitulah cara DI (Dependency Injection) bekerja di SwiftUI tanpa wadah DI eksternal. Setiap pengubah mengembalikan view baru dengan perubahan yang diterapkan, tanpa mengubah aslinya. Ini dimungkinkan berkat imutabilitas (immutability) tipe nilai (value types).

ViewBuilder dan kondisional

ViewBuilder adalah result builder, yang dianotasi dengan @resultBuilder, yang mengumpulkan hingga 10 view menjadi satu. Di dalam body, if/else, switch, dan ForEach dapat digunakan tanpa pembungkus tambahan. ForEach bekerja dengan elemen Identifiable — setiap view menerima id unik untuk animasi yang benar saat menyisipkan/menghapus.

Manajemen status: @State, @Binding, @ObservedObject

Di SwiftUI, status menentukan konten apa yang ditampilkan di layar. Ketika status berubah, SwiftUI membuat ulang body dari view yang bergantung dan membandingkan hasilnya dengan sebelumnya, menerapkan algoritma diff. Untuk menyimpan status digunakan property wrappers — masing-masing menyelesaikan tugasnya sendiri: status lokal, koneksi dengan view anak, atau model data eksternal.

swift
struct CounterView: View {
    @State private var count = 0

    var var body: some View {
        VStack {
            Text("Penghitung: \(count)")
            Button("Tambah") {
                count += 1
            }
        }
    }
}

class UserViewModel: ObservableObject {
    @Published var name = ""
    @Published var age = 0
}

@State menyimpan nilai lokal sederhana (Int, String, Bool) di dalam struktur View. SwiftUI memindahkan memori dari struktur ke penyimpanan terpisah — oleh karena itu properti dengan @State dapat diubah (dimutasi), meskipun View adalah tipe nilai. @ObservableObject — untuk kelas dengan properti @Published, yang perubahannya secara otomatis memberi tahu SwiftUI tentang perlunya penggambaran ulang.

@Binding dan hubungan orangtua-anak

@Binding menciptakan koneksi dua arah dengan sumber data yang terletak di view induk. Induk meneruskan $variable (projected value), anak membaca dan menulis nilai melalui binding. Ini memungkinkan pemindahan input teks atau sakelar ke komponen terpisah, sambil mempertahankan status di induk. Tanpa @Binding, setiap perubahan memerlukan penutupan callback untuk meneruskan nilai baru ke atas.

Sebelum iOS 16, navigasi di SwiftUI dibangun di atas NavigationView — API usang dengan perilaku kompleks di iPad (split view, double column). Mulai iOS 16, Apple merekomendasikan NavigationStack — alternatif yang disederhanakan dengan rute yang aman tipe. Pengembang mendefinisikan enum dari rute yang mungkin, dan NavigationStack secara otomatis mengelola tumpukan layar dengan dukungan untuk tautan dalam dan kembali ke akar.

swift
enum Route: Hashable {
    case detail(id: Int)
    case settings
}

struct ContentView: View {
    var var body: some View {
        NavigationStack {
            List {
                NavigationLink("Layar detail",
                               value: Route.detail(id: 42))
                NavigationLink("Pengaturan",
                               value: Route.settings)
            }
            .navigationDestination(for: Route.self) { route in
                switch route {
                case .detail(let id): DetailView(id: id)
                case .settings: SettingsView()
                }
            }
        }
    }
}

Rute bertipe Route: Hashable memungkinkan penggunaan tipe data apa pun untuk meneruskan parameter. navigationDestination(for:destination:) menghubungkan tipe rute dengan view tujuan. Keuntungan dibandingkan navigasi UIKit — penggambaran ulang tidak diperlukan saat menambahkan rute baru: cukup tambahkan case di enum dan handler di switch. Tautan dalam diproses melalui processDeepLink pada NavigationStack.

Navigasi Terprogram

Untuk transisi terprogram (setelah login, timer, atau respons server) digunakan @State dengan inisialisasi NavigationLink: NavigationLink(isActive: $isActive). Saat mengatur isActive = true, transisi terjadi tanpa sentuhan pengguna. Alternatifnya — binding array $path di NavigationStack: $path.append(Route.detail(id: 1)).

View Modifier — konfigurasi tampilan

Modifier adalah metode yang mengembalikan salinan view yang dimodifikasi. Tidak seperti UIKit, di mana konfigurasi properti dilakukan melalui mutasi view yang ada, SwiftUI membuat nilai baru dengan perubahan yang diterapkan. Rantai pengubah (chaining) membangun antarmuka akhir dari transformasi berurutan: font → spasi → warna → bayangan → gerakan.

Apple menyediakan lebih dari 200 pengubah bawaan. Yang paling umum adalah: .font(), .foregroundColor(), .padding(), .background(), .cornerRadius(), .shadow(), .opacity(), .offset(). Urutan pengubah itu penting: .padding() sebelum .background() mewarnai area dengan spasi, setelahnya — hanya area dalam. Pengubah kustom dibuat melalui protokol ViewModifier.

Pengubah bersyarat dan animasi

Pengubah dapat diterapkan secara bersyarat melalui operator ternary: .foregroundColor(isError ? .red : .primary). Untuk animasi digunakan .animation(.easeInOut, value: state) — pengubah animasi terikat pada properti status tertentu. Saat properti ini berubah, SwiftUI menganimasikan transisi antara nilai lama dan baru. Animasi bekerja dengan opacity, offset, scale, rotation, ukuran, dan warna — untuk setiap properti ditentukan AnimatableParameter yang sesuai.

Untuk animasi kustom tersedia .transition (muncul/hilang) dan .matchedGeometryEffect (transisi mulus elemen antara dua wadah). Yang terakhir digunakan untuk animasi hero dalam daftar: ikon di sel daftar berubah mulus menjadi gambar besar di layar detail.

SwiftUI vs UIKit: perbandingan pendekatan

Pilihan antara SwiftUI dan UIKit adalah salah satu dilema pertama pengembang iOS. Kedua framework didukung oleh Apple, tetapi menyelesaikan tugas membangun antarmuka dengan cara yang fundamental berbeda: SwiftUI secara deklaratif, UIKit secara imperatif. Perbedaannya terlihat dalam manajemen status, navigasi, kinerja, dan kompatibilitas.

AspekSwiftUIUIKit
PendekatanDeklaratif: apa yang ditampilkanImperatif: bagaimana membangun
StatusProperty Wrappers, penggambaran ulang otomatisManual: reloadData, setNeedsLayout
Kode UIRingkas, rantai pengubahBervolume, NSCoder/Storyboard/konstrain
KinerjaTinggi di iOS 17+, algoritma diffPuncak di iOS 12–16, kontrol langsung
Versi minimaliOS 15+ (dukungan penuh)iOS 2+ (semua versi)

Untuk proyek baru dengan versi minimal iOS 17, Apple merekomendasikan SwiftUI sebagai framework utama. UIKit tetap diperlukan untuk antarmuka yang memerlukan kontrol halus atas rendering (UICollectionViewLayout kustom, skena CAAnimation kompleks) atau dukungan untuk iOS 12–14. Banyak proyek menggunakan pendekatan hibrida: SwiftUI melalui UIHostingController disematkan ke dalam aplikasi UIKit, dan UIViewRepresentable memungkinkan penggunaan komponen UIKit di dalam hierarki SwiftUI.

Pertanyaan yang Sering Diajukan

Bisakah SwiftUI dan UIKit digunakan bersama dalam satu proyek?

Ya, melalui UIHostingController (SwiftUI di UIKit) dan UIViewRepresentable (UIKit di SwiftUI). Ini adalah pendekatan hibrida yang populer saat migrasi.

Dari versi iOS mana saya harus memulai proyek SwiftUI?

iOS 17 — fungsionalitas penuh: NavigationStack, Observation framework, Swift Charts. iOS 15 — ambang batas minimal untuk produksi.

Mengapa SwiftUI terkadang tidak memperbarui antarmuka?

Penyebab paling umum adalah mengubah properti @Published di thread latar belakang. ObservableObject harus mengirim perubahan ke main actor: @MainActor class ViewModel.

Bagaimana cara menangani penekanan tombol dengan penundaan di SwiftUI?

Gunakan .debounce melalui Combine: Button.publisher(for: .tap) .debounce(for: .seconds(0.3), scheduler: RunLoop.main).

Apakah SwiftUI mendukung gerakan kustom?

Ya, melalui pengubah Gesture: DragGesture, LongPressGesture, MagnificationGesture, RotationGesture. Gabungkan melalui .simultaneousGesture() dan .sequenced().

Kesimpulan

  • SwiftUI — framework deklaratif Apple, di mana antarmuka dideskripsikan sebagai komposisi struktur View dengan property wrappers untuk manajemen status.
  • View Protocol dengan properti terkomputasi body — satu-satunya titik masuk untuk setiap view. ViewBuilder mengumpulkan hingga 10 view menjadi satu tanpa wadah yang tidak perlu.
  • @State, @Binding, dan @ObservedObject mencakup semua skenario manajemen data: status lokal, hubungan orangtua-anak, dan model eksternal.
  • NavigationStack dengan rute enum yang aman tipe menggantikan NavigationView, menambahkan dukungan untuk tautan dalam dan navigasi terprogram.
  • Modifier — pola kunci SwiftUI, yang memungkinkan konfigurasi tampilan view melalui rantai panggilan tanpa pewarisan.
  • SwiftUI dan UIKit hidup berdampingan melalui UIHostingController dan UIViewRepresentable, memungkinkan migrasi proyek secara bertahap.
  • Untuk iOS 17+, Apple merekomendasikan SwiftUI sebagai framework utama; UIKit tetap untuk antarmuka kustom yang kompleks dan dukungan versi lama.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga