Pelajari mengapa Apple membuat Swift, bagaimana ia secara bertahap menggantikan Objective‑C di aplikasi iOS, dan apa arti pergeseran itu untuk tooling, hiring, dan basis kode hari ini.

Swift tidak muncul hanya karena Apple menginginkan bahasa baru “untuk bersenang‑senang.” Bahasa ini adalah jawaban atas titik sakit nyata dalam pengembangan iOS: iterasi lambat, pola tidak aman yang mudah tertulis tanpa sengaja, dan ketidaksesuaian yang tumbuh antara kompleksitas aplikasi modern dan desain Objective‑C yang lebih tua.
Postingan ini menjawab pertanyaan praktis: mengapa Swift ada, bagaimana ia menjadi default, dan mengapa sejarah itu masih memengaruhi basis kode serta keputusan tim Anda hari ini.
Anda akan mendapatkan timeline ringan dan jelas—dari rilis awal Swift hingga toolchain yang stabil dan banyak diadopsi—tanpa tersesat di trivia. Sepanjang jalan, kita akan mengaitkan sejarah itu ke konsekuensi sehari‑hari: bagaimana pengembang menulis kode yang lebih aman, bagaimana API berevolusi, apa yang berubah di alur kerja Xcode, dan apa makna “Swift modern” dengan fitur seperti konkurensi dan SwiftUI.
Objective‑C masih hadir di banyak aplikasi sukses, khususnya basis kode lama dan beberapa pustaka tertentu. Tujuan di sini bukan menimbulkan ketakutan atau urgensi—melainkan kejelasan: Swift tidak menghapus Objective‑C dalam semalam; ia menggantikan secara bertahap lewat interoperabilitas dan pergeseran ekosistem.
Objective‑C adalah fondasi pengembangan Apple selama dekade. Ketika SDK iPhone pertama tiba pada 2008, Objective‑C (ditambah framework Cocoa Touch) adalah cara utama membangun aplikasi, sebagaimana ia sudah menjadi standar untuk Mac OS X dengan Cocoa. Jika Anda menulis aplikasi iOS di tahun‑tahun awal, Anda pada dasarnya mempelajari konvensi platform Apple lewat Objective‑C.
Objective‑C punya banyak keunggulan—terutama bila Anda mengikuti "cara Cocoa" dalam membangun perangkat lunak.
Ia berdiri di atas runtime dinamis yang kuat: messaging, introspeksi, categories, dan method swizzling memungkinkan pola yang terasa fleksibel dan "plug-in friendly." Konvensi Cocoa seperti delegation, target–action, notifikasi, dan KVC/KVO (key‑value coding/observing) terintegrasi erat dan terdokumentasi baik.
Sama pentingnya, ia memiliki ekosistem matang. Framework Apple, pustaka pihak ketiga, dan jawaban‑jawaban di Stack Overflow bertahun‑tahun mengasumsikan Objective‑C. Tooling dan API dibangun mengelilinginya, dan tim bisa mempekerjakan pengembang dengan keahlian yang dapat diprediksi.
Titik sakitnya bukan filosofis—melainkan friksi praktis sehari‑hari.
Objective‑C bisa verbose, terutama untuk tugas “sederhana.” Tanda kurung, tanda method, dan boilerplate membuat kode lebih panjang dan sulit dipindai. Banyak API memperlihatkan konsep bertumpu pada pointer yang meningkatkan kemungkinan kesalahan, terutama sebelum ARC (Automatic Reference Counting) menjadi standar.
Masalah memori dan keamanan tetap menjadi perhatian. Bahkan dengan ARC, Anda masih perlu memahami kepemilikan, reference cycle, dan bagaimana nullability bisa mengejutkan Anda di runtime.
Berinteraksi dengan API C juga lazim—dan tidak selalu menyenangkan. Menjembatani tipe C, berurusan dengan Core Foundation, dan mengelola "toll‑free bridging" menambah beban mental yang tidak terasa seperti menulis kode aplikasi modern.
Basis kode iOS warisan sering bergantung pada Objective‑C karena stabil, teruji di lapangan, dan mahal untuk ditulis ulang. Banyak aplikasi jangka panjang menyertakan lapisan Objective‑C (atau dependensi lama) yang masih melakukan pekerjaan nyata—dan melakukannya dengan andal.
Apple tidak membuat Swift karena Objective‑C “rusak.” Objective‑C menjalankan bertahun‑tahun aplikasi iPhone dan Mac dengan sukses. Tapi seiring aplikasi membesar, tim bertambah, dan API meluas, biaya dari beberapa default Objective‑C menjadi lebih terlihat—terutama bila Anda mengalikan risiko kecil itu di jutaan baris kode.
Salah satu tujuan utama adalah membuat kesalahan umum menjadi lebih sulit ditulis. Fleksibilitas Objective‑C kuat, tetapi ia bisa menyembunyikan masalah hingga runtime: mengirim pesan ke nil, tipe id yang membingungkan, atau pengelolaan nullability yang salah pada API. Banyak masalah ini bisa diatasi dengan disiplin, konvensi, dan review—but tetap mahal dalam skala besar.
Swift memasukkan pembatasan: optionals memaksa Anda memikirkan “bisa tidak adanya nilai ini?”, tiping kuat mengurangi penyalahgunaan tak sengaja, dan fitur seperti guard, eksaustivitas switch, serta penanganan koleksi yang lebih aman memindahkan lebih banyak bug ke waktu kompilasi alih‑alih produksi.
Swift juga memodernkan pengalaman harian menulis kode. Sintaks ringkas, type inference, dan pustaka standar yang lebih kaya membuat banyak tugas lebih jelas dengan lebih sedikit boilerplate dibandingkan pola header/implementation, solusi generik verbose, atau penggunaan macro berat.
Mengenai performa, Swift dirancang untuk memungkinkan optimisasi kompiler agresif (terutama dengan tipe nilai dan generik). Itu tidak otomatis membuat setiap aplikasi Swift lebih cepat daripada setiap aplikasi Objective‑C, tetapi memberi Apple model bahasa yang dapat berevolusi menuju kecepatan tanpa terlalu bergantung pada perilaku runtime dinamis.
Apple perlu agar pengembangan iOS bisa diakses oleh pengembang baru dan dapat dipertahankan untuk produk jangka panjang. Konvensi penamaan API Swift, niat yang lebih jelas di titik pemanggilan, dan penekanan pada tipe yang ekspresif bertujuan mengurangi "pengetahuan suku" dan membuat basis kode lebih mudah dibaca beberapa bulan kemudian.
Hasilnya: lebih sedikit jebakan, API lebih bersih, dan bahasa yang lebih mendukung tim besar memelihara aplikasi selama bertahun‑tahun—tanpa mengklaim Objective‑C tak mampu melakukan tugas tersebut.
Swift tidak "menang" dalam semalam. Apple memperkenalkannya sebagai opsi yang lebih baik untuk kode baru, lalu menghabiskan bertahun‑tahun membuatnya stabil, lebih cepat, dan lebih mudah diadopsi berdampingan dengan aplikasi Objective‑C yang ada.
Stabilitas ABI berarti runtime Swift dan pustaka standar kompatibel di level binari antar versi Swift 5 di platform Apple. Sebelum Swift 5, banyak aplikasi harus membundel pustaka Swift di dalam aplikasi, menambah ukuran aplikasi dan mempersulit distribusi. Dengan stabilitas ABI, Swift menjadi lebih mirip Objective‑C dalam bagaimana kode terkompilasi bisa dijalankan secara andal antar pembaruan OS, membantu Swift terasa “aman” untuk basis kode produksi jangka panjang.
Selama bertahun‑tahun, banyak tim menggunakan Swift untuk fitur baru sementara modul inti tetap di Objective‑C. Jalur bertahap ini—daripada rewrite total—membuat kebangkitan Swift praktis untuk aplikasi nyata dan tenggat nyata.
Swift tidak menang dengan memaksa setiap tim membuang kode Objective‑C yang bekerja. Apple memastikan kedua bahasa bisa hidup berdampingan dalam target aplikasi yang sama. Kompatibilitas itu adalah alasan besar adopsi Swift tidak mandek di hari pertama.
Basis kode campuran itu normal di iOS: Anda bisa mempertahankan networking, analytics, atau komponen UI lama di Objective‑C sambil menulis fitur baru di Swift. Xcode mendukung ini langsung, jadi “Swift menggantikan Objective‑C” biasanya berarti perubahan bertahap, bukan rewrite besar.
Interoperabilitas bekerja lewat dua mekanisme yang saling melengkapi:
YourModuleName-Swift.h) yang mengekspos kelas dan metode Swift yang kompatibel dengan Objective‑C. Anda biasanya memilih keterlihatan dengan atribut seperti @objc (atau mewarisi dari NSObject).Anda tidak perlu menghafal seluruh mekanik untuk mendapat manfaat—tetapi memahami ada langkah eksplisit “ekspos ini ke bahasa lain” membantu menjelaskan mengapa beberapa tipe muncul otomatis dan lainnya tidak.
Kebanyakan tim menghadapi beberapa titik integrasi berulang:
Aplikasi nyata berumur panjang. Interoperabilitas memungkinkan Anda memigrasi fitur demi fitur, terus mengirim rilis, dan mengurangi risiko—terutama ketika SDK pihak ketiga, komponen lama, atau keterbatasan waktu membuat konversi sekaligus tidak realistis.
Swift tidak hanya memodernkan sintaks—ia mengubah seperti apa kode iOS “normal” sehari‑hari. Banyak pola yang dulu bergantung pada konvensi (dan review hati‑hati) menjadi sesuatu yang bisa dibantu oleh compiler.
nil menjadi eksplisitPengembang Objective‑C terbiasa pesan ke nil yang diam‑diam tidak melakukan apa‑apa. Swift membuat ketidakhadiran eksplisit dengan optionals (String?), mendorong Anda menangani nilai yang hilang di muka dengan if let, guard, atau ??. Itu cenderung mencegah kategori crash dan bug logika “kenapa ini kosong?”—tanpa mengklaim kesalahan tak akan pernah terjadi.
Swift dapat menebak tipe di banyak tempat, yang memangkas boilerplate sambil menjaga kode tetap terbaca:
let title = "Settings" // inferred as String
Lebih penting lagi, generik memungkinkan Anda menulis kode yang dapat digunakan ulang dan aman‑tipe tanpa bergantung pada id dan pemeriksaan runtime. Bandingkan "array apa saja" dengan "array persis yang saya harapkan"—lebih sedikit objek tak terduga masuk dan lebih sedikit forced cast.
throw/try/catch Swift mendorong jalur error eksplisit daripada mengabaikan kegagalan atau meneruskan NSError **. Koleksi bertipe kuat ([User], [String: Int]), dan string adalah String Unicode‑correct penuh alih‑alih campuran C string, NSString, dan keputusan enkoding manual. Efeknya: lebih sedikit kesalahan off‑by‑one, asumsi tidak valid, dan kasus "kompilasi tapi rusak saat runtime".
Runtime Objective‑C tetap bernilai untuk pola‑pola heavy runtime: method swizzling, dynamic message forwarding, pendekatan dependency injection tertentu, kode yang digerakkan KVC/KVO, dan arsitektur plugin lama. Swift dapat berinteroperasi dengan ini, tetapi ketika Anda benar‑benar membutuhkan dinamika runtime, Objective‑C tetap alat praktis.
Swift tidak hanya mengubah sintaks—ia memaksa ekosistem iOS memodernkan tooling dan konvensi. Transisi itu tidak selalu mulus: rilis Swift awal sering berarti build yang lebih lambat, autocomplete yang kurang stabil, dan refaktor yang terasa lebih berisiko daripada seharusnya. Seiring waktu, pengalaman pengembang menjadi salah satu keuntungan terbesar Swift.
Dukungan Xcode untuk Swift meningkat secara praktis sehari‑hari:
Jika Anda menggunakan Swift di era 1.x/2.x, mungkin ingat tepi kasar. Sejak itu tren konsisten: indeksasi lebih baik, stabilitas sumber lebih baik, dan lebih sedikit momen "Xcode bingung."
Swift Package Manager (SPM) mengurangi kebutuhan sistem dependensi eksternal di banyak tim. Pada tingkat dasar, Anda mendeklarasikan paket dan versi, Xcode menyelesaikannya, dan build terintegrasi tanpa akrobatik file proyek tambahan. Bukan solusi sempurna untuk segala pengaturan, tetapi bagi banyak aplikasi ia menyederhanakan onboarding dan membuat pembaruan dependensi lebih dapat diprediksi.
Pedoman Desain API Apple mendorong framework ke penamaan yang lebih jelas, perilaku default yang lebih baik, dan tipe yang mengomunikasikan maksud. Pengaruh itu menyebar: pustaka pihak ketiga makin mengadopsi API yang Swift‑first, membuat basis kode iOS modern lebih konsisten—meskipun masih menjembatani ke Objective‑C di balik layar.
UIKit belum pergi ke mana‑mana. Sebagian besar aplikasi produksi iOS masih sangat bergantung padanya, terutama untuk navigasi kompleks, gesture halus, pengolahan teks tingkat lanjut, dan ekor panjang komponen UI yang sudah diuji tim. Yang berubah adalah: Swift kini cara default orang menulis kode UIKit—meskipun framework dasarnya sama.
Bagi banyak tim, "aplikasi UIKit" tidak lagi berarti Objective‑C. Storyboard, nib, dan view programatik sering dikendalikan oleh view controller Swift dan model Swift.
Perubahan ini penting karena Apple semakin merancang API baru dengan ergonomi Swift dalam pikiran (penamaan lebih jelas, optionals, generik, result types). Bahkan ketika API tersedia untuk Objective‑C, overlay Swift sering terasa sebagai permukaan yang “dimaksudkan”, sehingga memengaruhi seberapa cepat pengembang baru bisa produktif di basis kode UIKit.
SwiftUI bukan sekadar cara baru menggambar tombol. Ia mendorong model mental berbeda:
Dalam praktiknya, itu mengubah diskusi arsitektur aplikasi. Tim yang mengadopsi SwiftUI sering lebih menekankan aliran data unidirectional, komponen view lebih kecil, dan pemisahan efek samping (networking, persistence) dari kode view. Bahkan jika Anda tidak "all in", SwiftUI bisa mengurangi boilerplate untuk layar yang didominasi form, list, dan layout berbasis state.
Aplikasi yang dikirim sering mengombinasikan kedua framework:
UIHostingController untuk layar baru.Pendekatan hibrida ini memungkinkan tim mempertahankan infrastruktur UIKit matang—navigation stacks, coordinator, design system—sambil mengadopsi SwiftUI secara bertahap di area yang memberikan manfaat jelas. Ini juga menjaga risiko tetap terkelola: Anda bisa menguji SwiftUI di area terbatas tanpa menulis ulang seluruh lapisan UI.
Jika Anda memulai proyek baru hari ini, cerita UI terbaru Apple adalah SwiftUI, dan banyak teknologi terkait (widget, Live Activities, beberapa app extension) sangat condong ke Swift. Bahkan di luar UI, API yang ramah Swift di seluruh platform Apple membentuk default: proyek baru biasanya direncanakan dengan Swift, dan keputusan menjadi "seberapa banyak UIKit yang kita butuhkan?" daripada "haruskah kita pakai Objective‑C?"
Hasilnya bukan sekadar satu framework menggantikan yang lain, melainkan Swift menjadi bahasa umum di jalur lama yang bersahabat dengan warisan (UIKit) dan jalur baru yang native Swift (SwiftUI).
Konkurensi adalah bagaimana sebuah aplikasi melakukan beberapa hal “sekali waktu”—memuat data, mengurai JSON, dan memperbarui layar—tanpa membekukan antarmuka. Pendekatan modern Swift dirancang agar pekerjaan ini terasa seperti kode normal dan bukan permainan tali antar thread.
Dengan async/await, Anda bisa menulis pekerjaan asinkron (seperti request jaringan) dengan gaya top‑to‑bottom:
async menandai fungsi yang mungkin berhenti sementara menunggu sesuatu.await adalah titik “tunggu di sini sampai hasil siap”.Daripada nested completion handler, Anda membacanya seperti resep: ambil data, parse, lalu perbarui state.
Swift memasangkan async/await dengan structured concurrency, yang secara sederhana berarti: “pekerjaan latar memiliki pemilik dan lifetime yang jelas.” Task dibuat dalam scope, dan task anak terikat pada parent‑nya.
Ini penting karena meningkatkan:
Dua konsep membantu mengurangi crash acak akibat akses bersamaan:
Kebanyakan tim tidak menyalakan semuanya sekaligus. Umumnya terjadi campuran konkurensi Swift modern dengan pola lama—OperationQueue, GCD, callback delegate, dan completion handler—terutama saat mengintegrasikan pustaka legacy atau alur UIKit lama.
Memigrasi aplikasi iOS nyata bukan proyek "konversi semua"—melainkan proyek manajemen risiko. Tujuannya adalah tetap mengirim rilis sambil bertahap mengurangi jumlah Objective‑C yang harus Anda pelihara.
Pendekatan umum adalah migrasi bertahap:
Ini memungkinkan membangun kepercayaan sambil membatasi blast radius—terutama ketika tenggat tidak menunggu transisi bahasa.
Beberapa pola Objective‑C tidak terjemah dengan mulus:
objc_runtime berat mungkin perlu desain ulang daripada terjemahan.Anggap migrasi sebagai pertukaran implementasi, bukan perubahan fitur. Tambahkan tes karakterisasi di area alur kritis terlebih dahulu (networking, caching, pembayaran, auth), lalu port. Tes snapshot dapat membantu menangkap regresi UI ketika kode UIKit bergerak ke Swift.
Buat standar ringan yang tim ikuti: konvensi penulisan kode, linting (SwiftLint atau sejenis), batas modul, aturan bridging header, dan "tidak ada Objective‑C baru kecuali ada alasan." Menuliskannya mencegah basis kode menjadi bilingual dengan cara yang tidak konsisten.
Swift tidak hanya mengubah sintaks—ia mengubah apa yang dianggap "normal" di tim iOS. Bahkan jika produk Anda masih memiliki Objective‑C di dalamnya, keputusan sehari‑hari tentang orang, proses, dan perawatan jangka panjang kini dibentuk oleh ekspektasi Swift‑first.
Sebagian besar posisi iOS baru mengasumsikan Swift sebagai default. Kandidat mungkin belum pernah mengirim Objective‑C secara profesional, dan itu memengaruhi waktu ramp‑up jika basis kode Anda bercampur.
Rekomendasi praktis: anggap pengetahuan Objective‑C sebagai "nilai tambah", bukan kriteria wajib, dan buat materi onboarding yang jelas tentang di mana Objective‑C ada dan mengapa. Panduan internal singkat tentang bridging header, kepemilikan file, dan area "jangan ubah tanpa konteks" bisa mencegah kesalahan awal.
Tipe lebih kuat dan optionals yang jelas di Swift dapat membuat review lebih cepat: reviewer menghabiskan lebih sedikit waktu menebak apa yang mungkin berisi sebuah nilai, dan lebih banyak waktu memvalidasi niat. Pola seperti protocol, generik, dan tipe nilai juga mendorong arsitektur lebih konsisten—jika digunakan dengan pengekangan.
Baliknya adalah drift gaya. Tim mendapat manfaat dari panduan gaya Swift bersama dan formatting/linting otomatis sehingga review fokus pada perilaku, bukan whitespace. (Jika sudah punya pedoman, tautkan dari hub dokumen internal Anda.)
Pemeliharaan menjadi lebih mudah saat Anda dapat langsung memanfaatkan API modern alih‑alih membawa pembungkus kustom di sekitar pola lama. Tetapi Objective‑C tidak akan hilang dalam semalam—terutama di aplikasi matang dengan modul stabil dan teruji.
Anggarkan secara realistis untuk basis kode campuran: rencanakan migrasi di sekitar milestone bisnis, bukan sebagai "pembersihan" tanpa akhir. Definisikan apa arti "selesai" (mis. semua kode baru di Swift, modul legacy hanya disentuh secara oportunistik), dan tinjau aturan itu saat refaktor besar.
Untuk kerangka pengambilan keputusan, lihat /blog/migrating-objective-c-to-swift.
Memilih antara Swift dan Objective‑C biasanya bukan debat filosofis—melainkan keputusan biaya, risiko, dan timeline. Kabar baiknya: jarang Anda harus memilih "semua atau tidak sama sekali." Sebagian besar tim mendapatkan hasil terbaik dengan mengembangkan basis kode di tempat.
Jika Anda memulai dari nol, Swift harus menjadi default. Ia selaras dengan API terbaru Apple, punya fitur keselamatan lebih baik, dan memberi akses langsung ke pola modern seperti async/await.
Keputusan pertama Anda adalah strategi UI: UIKit dalam Swift, SwiftUI, atau campuran. Jika ragu, bandingkan tradeoff di /blog/swiftui-vs-uikit.
Untuk aplikasi Objective‑C yang sudah ada, pertahankan modul stabil yang teruji di Objective‑C dan perkenalkan Swift di tempat Anda cepat mendapat manfaat:
Aturan praktis: mulai modul Swift baru ketika Anda bisa mendefinisikan batas yang jelas (permukaan API, kepemilikan, tes). Pertahankan Objective‑C tetap stabil ketika kode matang, saling terkait erat, atau berisiko disentuh tanpa refaktor lebih besar.
Untuk perencanaan, cek /blog/ios-migration-checklist.
Untuk individu dan tim, urutan ini cocok dengan pengembangan iOS sehari‑hari:
Memodernisasi kode iOS sering memunculkan pekerjaan "di sekitarnya" yang bersaing untuk waktu engineering yang sama: dashboard admin, tooling internal, layanan backend, dan API yang tergantung pada aplikasi iOS. Jika Anda ingin tim iOS tetap fokus pada migrasi Swift sambil tetap mengirim perangkat lunak pendukung, Koder.ai bisa membantu Anda membuat web app, backend Go (dengan PostgreSQL), atau companion app Flutter lewat workflow berbasis chat—lalu ekspor kode sumber, deploy, dan gunakan snapshot/rollback untuk mengelola iterasi dengan aman.
Jika Anda ingin bantuan luar untuk merencanakan langkah teraman berikutnya—modul baru, migrasi parsial, atau “biarkan saja”—lihat /pricing.
Swift dibuat untuk mengurangi risiko umum dalam pengembangan iOS (seperti perilaku nil yang tak terduga dan tiping longgar), meningkatkan keterbacaan/keawetan kode pada basis kode besar, dan memungkinkan optimisasi kompiler yang lebih agresif dari waktu ke waktu. Itu bukan karena Objective‑C “buruk” — melainkan untuk membuat default yang lebih aman dan modern lebih mudah dipakai berskala besar.
Swift menjadi bahasa default lewat kombinasi bertahap dari beberapa faktor:
Itu membuat “kode baru ditulis dengan Swift” menjadi jalur paling mudah bagi kebanyakan tim.
Swift 5 memperkenalkan stabilitas ABI pada platform Apple, artinya kode Swift yang dikompilasi dapat kompatibel secara binari antar versi runtime Swift 5.x yang disertakan dengan OS. Secara praktis, ini mengurangi kebutuhan untuk menyertakan pustaka Swift dalam paket aplikasi, membantu ukuran aplikasi dan keandalan deploy, serta membuat Swift terasa lebih aman untuk basis kode produksi jangka panjang.
Keduanya bisa hidup di target aplikasi yang sama:
YourModuleName-Swift.h yang mengekspos API Swift yang kompatibel dengan Objective‑C, biasanya dengan @objc dan/atau pewarisan dari NSObject.Tidak semua fitur Swift terlihat dari Objective‑C, jadi rencanakan batasan modul secara sengaja.
Optionals (T?) membuat "nilai yang hilang" menjadi eksplisit dan memaksa penanganan pada waktu kompilasi (misalnya if let, guard, ??). Di Objective‑C, pengiriman pesan ke nil dan kebingungan nullability bisa menyembunyikan bug sampai runtime. Keuntungan praktisnya adalah lebih sedikit crash dan lebih sedikit bug logika karena nilai yang tak terduga kosong.
Generik dan tiping kuat Swift mengurangi casting dan pemeriksaan tipe di runtime (yang umum dengan id dan koleksi tanpa tipe di Objective‑C). Dalam praktiknya, Anda mendapatkan:
[User] alih-alih “array apa saja”Ya — Objective‑C masih masuk akal ketika Anda benar‑benar membutuhkan dinamika runtime (mis. penggunaan KVC/KVO intensif, method swizzling, API berbasis selector, atau beberapa arsitektur plugin). Swift bisa berinteroperasi dengan pola‑pola ini, tetapi padanan murni Swift kadang memerlukan redesain alih‑alih terjemahan langsung.
Pendekatan praktisnya adalah migrasi bertahap:
Anggap ini sebagai manajemen risiko: tetap kirim rilis sambil mengurangi biaya pemeliharaan jangka panjang.
Kendala umum meliputi:
@objc, NSObject, dan fitur bahasa terbatas).Rencanakan batas modul dan tambahkan tes sebelum menukar implementasi.
Tidak sama sekali. Banyak aplikasi produksi bersifat hibrida:
UIHostingController untuk menyematkan layar SwiftUI di dalam UIKit.Ini memungkinkan tim mengadopsi SwiftUI di area yang mengurangi boilerplate sambil mempertahankan navigasi UIKit, infrastruktur, dan komponen kompleks yang sudah matang.