Cara membuat jembatan antar kerangka kerja di aplikasi iOS

Jika kode aplikasi Anda terlihat seperti ini ...

"Saya ingin mengekspor bagian dari aplikasi saya, tetapi itu terikat ke seluruh aplikasi seperti piring spageti!"

Mencoba mengekspor sebagian kecil aplikasi yang terlalu bergantung

Ketika saya mulai memodulasi bagian dari aplikasi yang sedang saya kerjakan, saya menabrak tembok.

Saya ingin mengekspor layanan (sebenarnya itu adalah layanan Pelacakan) ke dalam kerangka kerja yang terpisah. Masalahnya adalah layanan ini terlalu sulit untuk dikaitkan dengan aplikasi. Itu menggunakan layanan lain yang dengan sendirinya menggunakan yang lain berlabuh dalam aplikasi.

Untuk mengekspor layanan pelacakan, saya harus memperbaiki dan membuat kembali seluruh rangkaian layanan dalam kerangka kerja baru!

Tetapi kenyataannya adalah saya tidak punya waktu untuk melakukan ini dan pengujian regresi akan menjadi mimpi buruk, dan untuk banyak alasan lain yang dapat Anda miliki di perusahaan mana pun (proses, anggaran, tenggat waktu).
Jadi saya harus mencari tahu cara mengekspor bagian ini dari aplikasi saya tanpa refactoring semuanya.

Mari kita mulai dengan contoh nyata!

Di sinilah kita, cara terbaik untuk belajar dan memahami bagaimana segala sesuatu bekerja adalah dengan berlatih! (Saya akan memberikan repo Github untuk contoh ini di akhir posting ini)
Jadi izinkan saya mengatur konteksnya, kami memiliki aplikasi kecil dengan hanya 2 layar:

  • Layar beranda
  • Layar pembayaran (kami ingin mengekspor layar itu ke kerangka kerja)

Halaman pembayaran berisi TextField untuk memasukkan nomor kartu, dan tombol Bayar. Ketika Anda menekan tombol, pembayaran harus diluncurkan.
Tapi! Tantangannya terletak pada metode pembayaran. Mari kita anggap kita tidak bisa mengekspor layanan pembayaran untuk beberapa alasan yang saya bangkitkan sedikit lebih awal.

Layar Beranda dan layar Pembayaran

Jadi kami memiliki dua layar ini, dinyatakan dalam dua target berbeda. Layar beranda dinyatakan dalam target aplikasi utama, dan layar pembayaran dinyatakan dalam modul lain yang disebut PaymentModule. Kami juga memiliki Layanan Pembayaran yang dinyatakan dalam target aplikasi utama, sebagai berikut:

Metode pembayaran adalah metode yang tidak dapat kami ekstrak dari aplikasi karena terlalu bergantung. Tetapi kami ingin menggunakannya dari modul pembayaran.

Kami memiliki PaymentViewController yang didefinisikan dalam modul Pembayaran, jika kami mencoba memanggil PaymentService, kami akan memiliki kesalahan karena layanan ini tidak ada dalam modul. Anda tidak dapat mengimpor target utama dalam sebuah modul (itu akan menjadi omong kosong)

Jadi bagaimana kita akan menggunakan metode ini dari PaymentViewController?

Tentukan protokol dalam modul

Ini akan menjadi jembatan kita. Anda harus mendefinisikan protokol dalam modul dengan metode yang menggambarkan apa yang ingin Anda gunakan dalam target aplikasi utama.

Jadi, mari kita definisikan protokol bernama PaymentServiceProtocol dengan metode pembayaran:

Menerapkan protokol di aplikasi

Sekarang kita harus memberi tahu Layanan Pembayaran agar mematuhi protokol ini. Kami hanya perlu menambahkan ini:

"Mengapa metode yang dinyatakan dalam protokol tidak diterapkan dalam ekstensi ini?"

Anda benar, ketika menyesuaikan dengan protokol Anda harus mengimplementasikan properti dan metodenya. Kuncinya di sini adalah bahwa nama metode dalam protokol persis sama dengan nama metode di PaymentService yang kami nyatakan sedikit lebih awal. Dengan cara itu, sistem akan tahu bahwa ia harus menggunakan metode pembayaran yang dideklarasikan di kelas PaymentService ketika mengakses metode protokol.

Menghubungkan dua bagian

Kita sekarang harus menggabungkan dua bagian bersama.
Dari HomeViewController, ketika kita mengetuk tombol "Buka halaman pembayaran", kami membuat Instansi Pembayaran PaymentController. Pada saat itu, kami akan memberikan referensi ke kelas PaymentService, tetapi pengontrol pembayaran dalam modul akan melihatnya sebagai jenis PaymentServiceProtocol.

Ini triknya:

Kami melewati PaymentService.self dan kode dalam modul tersebut melihat PaymentServiceProtocol.Type.
Sekarang kita dapat menggunakan panggilan metode pembayaran yang ditentukan dalam aplikasi dari modul!

Menggunakan jembatan

Sekarang sangat mudah untuk menggunakan jembatan yang kami buat:

Metode didTapPayButton dipanggil setiap kali Anda menekan tombol Pay (terdengar benar, kan?). Periksa jalur 23: kami memanggil metode pembayaran pada referensi protokol yang kami dapatkan dari aplikasi.

Karena PaymentService sesuai dengan protokol ini, sistem akan mengeksekusi kode di dalam metode pembayaran, yang didefinisikan dalam PaymentService.swift.

Dengan kata lain, kami menggunakan metode yang tidak bisa kami panggil dari modul di awal! Jembatan sekarang sudah diatur.

Ini seperti apa ketika Anda mengetuk tombol bayar.

Menggunakan metode pembayaran yang terkandung dalam target utama, dari modul pembayaran

Kesimpulan

Untuk menyimpulkan, metode penghubung ini dapat digunakan jika Anda ingin mengekspor komponen aplikasi Anda ke dalam suatu kerangka kerja.

Teknik ini akan memungkinkan Anda untuk memotong mie dari mangkuk, jika Anda dipaksa untuk mengekspor bagian dari aplikasi Anda ke dalam kerangka kerja tetapi Anda tidak bisa mengekspor semuanya, dengan alasan apa pun yang Anda bisa miliki.

Saya pikir ini solusi sementara, sebelum mengeluarkan seluruh komponen di dalam kerangka kerja, ketika Anda akan punya waktu misalnya. (Dalam skenario ini, suatu hari Anda harus mengekspor metode pembayaran di dalam modul Pembayaran)

Saya akui bahwa di dunia yang ideal, dengan unicorn dan barang-barang mewah, kita tidak akan melakukan hal seperti itu. Kami lebih suka mengekspor seluruh komponen, tetapi seperti yang saya katakan berkali-kali ini tidak selalu mungkin.

Anda dapat menemukan repo Github dari proyek ini di sini, jangan ragu untuk memeriksa bagaimana jembatan dilakukan dan mencobanya sendiri.
Saya harap posting ini dapat membantu, jangan ragu untuk mengajukan pertanyaan yang ada dalam pikiran Anda!

Kisah ini diterbitkan di The Startup, publikasi kewirausahaan terbesar Menengah diikuti oleh +442.678 orang.

Berlangganan untuk menerima berita utama kami di sini.