Cara membuat jambatan antara rangka dalam apl iOS

Jika kod apl anda kelihatan seperti ini ...

"Saya mahu mengeksport bahagian aplikasi saya tetapi ia terikat kepada aplikasi yang lain seperti plat spageti!"

Cuba untuk mengeksport sebahagian kecil aplikasi yang terlalu bergantung

Apabila saya mula mengimplementasikan sebahagian daripada aplikasi yang saya sedang kerjakan, saya berlari ke dinding.

Saya mahu mengeksport perkhidmatan (sebenarnya perkhidmatan Penjejakan) menjadi kerangka berasingan. Masalahnya adalah bahawa perkhidmatan ini terlalu tidak terikat dengan aplikasinya. Ia menggunakan perkhidmatan lain yang menggunakan sendiri yang lain berlabuh dalam aplikasinya.

Untuk mengeksport perkhidmatan penjejakan, saya terpaksa membuat refactor dan membuat semula keseluruhan set perkhidmatan dalam rangka kerja baru!

Tetapi hakikatnya saya tidak mempunyai masa untuk melakukan ini dan pengujian regresi akan menjadi mimpi ngeri, dan untuk sebab-sebab lain yang boleh anda ada dalam mana-mana syarikat (proses, anggaran, tarikh akhir).
Jadi saya terpaksa mengetahui bagaimana untuk mengeksport bahagian aplikasi saya tanpa menguraikan semula segala-galanya.

Mari kita mulakan dengan contoh konkrit!

Di sini kita, cara terbaik untuk belajar dan memahami bagaimana perkara berfungsi adalah untuk mengamalkan! (Saya akan memberikan repo Github untuk contoh ini pada akhir jawatan ini)
Oleh itu, biarkan saya menetapkan konteks, kami mempunyai aplikasi kecil dengan hanya 2 skrin:

  • Skrin utama
  • Skrin bayaran (kami mahu mengeksport skrin itu ke dalam rangka kerja)

Halaman pembayaran mengandungi TextField untuk memasukkan nombor kad, dan butang Pay. Apabila anda menekan butang tersebut, pembayaran harus dilancarkan.
Tetapi! Cabaran berada dalam kaedah pembayaran. Mari kita katakan kita tidak dapat mengeksport perkhidmatan pembayaran untuk beberapa sebab yang saya buat sedikit lebih awal.

Skrin utama dan skrin Pembayaran

Jadi kita mempunyai dua skrin ini, diisytiharkan dalam dua sasaran yang berbeza. Skrin utama dinyatakan dalam sasaran aplikasi utama, dan skrin pembayaran dinyatakan dalam modul lain yang disebut PaymentModule. Kami juga mempunyai PaymentService yang diisytiharkan dalam sasaran aplikasi utama, seperti berikut:

Kaedah pembayaran adalah kaedah yang tidak boleh kita keluarkan dari aplikasi kerana ia terlalu bergantung. Tetapi kami mahu menggunakannya dari modul pembayaran.

Kami mempunyai PembayaranViewController yang ditakrifkan dalam modul Pembayaran, jika kami cuba menghubungi PaymentService kami akan mengalami ralat kerana perkhidmatan ini tidak dalam modul. Anda tidak boleh mengimport sasaran utama dalam modul (yang akan menjadi tidak masuk akal)

Jadi bagaimana kita akan menggunakan kaedah ini dari PaymentViewController?

Tentukan protokol dalam modul

Ini akan menjadi jambatan kami. Anda mesti menentukan protokol dalam modul dengan kaedah yang menerangkan apa yang anda mahu gunakan dalam sasaran aplikasi utama.

Oleh itu mari kita tentukan satu protokol yang bernama PaymentServiceProtocol dengan kaedah pembayaran:

Melaksanakan protokol dalam aplikasinya

Sekarang kita perlu memberitahu PaymentService kami untuk mematuhi protokol ini. Kami hanya perlu menambah ini:

"Mengapakah kaedah yang diisytiharkan dalam protokol tidak dilaksanakan dalam lanjutan ini?"

Anda betul, apabila mematuhi protokol anda mesti melaksanakan sifat dan kaedahnya. Silap mata di sini ialah nama kaedah dalam protokol adalah sama seperti nama kaedah dalam PaymentService yang kami nyatakan sedikit lebih awal. Dengan cara itu, sistem akan mengetahui ia perlu menggunakan kaedah pembayaran yang diisytiharkan dalam kelas PaymentService apabila mengakses kaedah protokol.

Menghubungkan kedua-dua bahagian

Kita mesti menyertai kedua-dua bahagian bersama-sama.
Dari HomeViewController, apabila kita mengetuk butang "Pergi ke halaman pembayaran", kami akan menamakan PembayaranViewController. Pada masa itu, kami akan menyerahkan rujukan kepada kelas PaymentService, tetapi pengawal pembayaran dalam modul akan melihatnya sebagai jenis PaymentServiceProtocol.

Berikut adalah helah:

Kami sedang lulus PaymentService.self dan kod dalam modul itu melihat PaymentServiceProtocol.Type.
Sekarang kita boleh menggunakan kaedah pembayaran panggilan yang ditakrifkan dalam aplikasi dari modul!

Menggunakan jambatan

Ia kini sangat mudah untuk menggunakan jambatan yang kami buat:

Kaedah didTapPayButton dipanggil setiap kali anda mengetuk butang Bayar (bunyi betul, kan?). Semak pada baris 23: kami memanggil kaedah pembayaran pada rujukan protokol yang kami dapat dari aplikasinya.

Oleh kerana PembayaranService mematuhi protokol ini, sistem akan melaksanakan kod di dalam kaedah pembayaran, yang ditakrifkan dalam PaymentService.swift.

Dalam erti kata lain, kami menggunakan kaedah yang tidak dapat kami panggil dari modul pada mulanya! Jambatan kini ditetapkan.

Berikut adalah apa yang kelihatan apabila anda mengetuk butang bayar.

Menggunakan kaedah pembayaran yang terkandung dalam sasaran utama, dari modul pembayaran

Kesimpulannya

Untuk membuat kesimpulan, kaedah penyambungan ini boleh digunakan jika anda ingin mengeksport komponen aplikasi anda ke dalam rangka kerja.

Teknik ini akan membolehkan anda memotong mie keluar dari mangkuk, jika anda terpaksa mengeksport bahagian aplikasi anda ke dalam kerangka tetapi anda tidak dapat mengeksport keseluruhannya, untuk alasan apa pun yang anda dapat.

Saya rasa ini penyelesaian sementara, sebelum mengeluarkan keseluruhan komponen di dalam rangka kerja, apabila anda akan mempunyai masa sebagai contoh. (Dalam senario ini, suatu hari nanti anda perlu mengeksport kaedah pembayaran di dalam modul Pembayaran)

Saya mengakui bahawa dalam dunia yang ideal, dengan unicorns dan barangan mewah, kita tidak akan melakukan sesuatu seperti itu. Kami lebih suka mengeksport keseluruhan komponen, tetapi seperti yang saya katakan berkali-kali ini tidak selalu mungkin.

Anda boleh mencari repo Github projek ini di sini, jangan teragak-agak untuk memeriksa bagaimana jambatan itu selesai dan cuba sendiri.
Saya harap jawatan ini dapat membantu, jangan ragu untuk bertanya apa-apa soalan yang anda fikirkan!

Kisah ini diterbitkan dalam penerbitan keusahawanan terbesar The Startup, Medium diikuti oleh +442,678 orang.

Langgan untuk menerima cerita teratas kami di sini.