Dalam bahagian 2 siaran ini tentang protokol Swift, anda akan mempelajari kegunaan praktikal untuk mengisytiharkan protokol tersuai dalam apl anda sendiri, dan mengetahui lebih lanjut cara ia menambah baik seni bina apl anda dan menjadikannya lebih mudah untuk dipertingkatkan dan dilanjutkan.
Dalam bahagian 1 daripada siaran ini, saya menunjukkan cara melaksanakan protokol Sentuhan Koko sedia ada dalam apl anda. Kini anda akan belajar bagaimana dan sebab untuk mencipta sendiri. Pertama, kita perlu merangkumi pembinaan asas protokol Swift.
Mengisytiharkan Protokol Anda Sendiri
Berikut ialah sintaks asas untuk mengisytiharkan protokol dalam Swift:
Kaedah Protokol
Protokol boleh menentukan contoh dan kaedah jenis yang mesti dilaksanakan oleh kelas yang mematuhinya.
Anda mengisytiharkan kaedah protokol dengan cara yang sama anda mengisytiharkannya untuk kelas, tetapi jangan masukkan pendakap kerinting atau kod pelaksanaan.
Berikut ialah contoh kaedah contoh yang menerima satu parameter integer dan mengembalikan nilai boolean:
Untuk mengisytiharkan kaedah jenis, gunakan kelas kata kunci. Kaedah jenis berikut tidak menerima parameter dan mengembalikan nilai integer:
Sifat Protokol
Protokol juga boleh mengisytiharkan sifat contoh dan jenis. Protokol menentukan nama dan jenis sifat, tetapi tidak menyatakan sama ada ia mesti disimpan atau sifat dikira. Walau bagaimanapun, protokol mesti menentukan sama ada harta itu baca-sahaja atau baca-tulis.
Sebagai contoh, protokol berikut mengisytiharkan sifat boolean baca-tulis bernama bertele-tele dan sifat integer baca sahaja bernama numberOfRetries :
Ahli Protokol Pilihan
Secara lalai, kaedah dan sifat yang diisytiharkan dalam protokol diperlukan—bermaksud mana-mana kelas yang mengguna pakai protokol mesti melaksanakannya.
Walau bagaimanapun, anda boleh menunjukkan bahawa ahli tertentu adalah pilihan dengan menggunakan pilihan kata kunci bersempena dengan @objc atribut.
Sebagai contoh, protokol berikut mengisytiharkan sifat verbose sebagai pilihan dan sifat numberOfRetries seperti yang diperlukan:
The @objc atribut boleh digunakan sebelum mana-mana kelas, kaedah atau harta Swift. Ia menunjukkan bahawa anda ingin mengaksesnya daripada Objective-C. Dalam kes ini, walaupun anda tidak mengaksesnya daripada Objektif-C, anda perlu menggunakannya untuk menandakan ahli protokol anda sebagai pilihan .
Menyemak Pematuhan Protokol
Kadangkala, anda mungkin ingin menyemak sama ada kelas mematuhi protokol tertentu. Gunakan Swift ialah pengendali untuk menyemak pematuhan, dan menggunakannya sebagai? dan sebagai operator untuk menghantar ke protokol tertentu. Protokol menggunakan sintaks yang sama seperti menyemak penghantaran ke jenis.
Terdapat dua kaveat penting mengenai menyemak pematuhan protokol:
- Anda mesti menandakan protokol anda dengan @objc atribut (seperti yang ditunjukkan dalam bahagian sebelumnya) untuk menyemaknya untuk pematuhan.
- Jika anda menandakan protokol anda dengan @objc atribut, anda hanya boleh menggunakan protokol pada kelas—bukan struktur atau penghitungan.
Warisan Protokol
Terdapat dua aspek pewarisan protokol.
Pertama, protokol diwarisi oleh subkelas. Jika kelas menggunakan protokol, subkelasnya secara automatik menerima pakai protokol.
Aspek kedua pewarisan protokol ialah anda boleh subkelas dan melanjutkan protokol itu sendiri.
Protokol boleh mewarisi satu atau lebih protokol dan melanjutkan protokol tersebut lebih jauh lagi. Sebagai contoh, dalam kod berikut, the boleh dicapai dan Boleh selamat protokol diwarisi oleh LocalizeableSecureableSustainable protokol, yang menambah sendiri isSustainable harta:
Kelas yang mengamalkan LocalizeableSecurableSustainable mesti melaksanakan semua ahli protokol yang diwarisinya serta ahli yang diisytiharkannya. Sebagai contoh:
Komposisi Protokol
Anda boleh menentukan bahawa pembolehubah, sifat atau parameter mengandungi jenis yang mematuhi berbilang protokol.
Sebagai contoh, kod berikut mengisytiharkan pembolehubah bernama localizeSecure yang mengandungi jenis yang mematuhi kedua-dua protokol Localizable dan Secureable:
Memandangkan pengisytiharan ini, jenis yang mematuhi hanya boleh dicapai protokol atau hanya Boleh selamat protokol tidak boleh disimpan dalam pembolehubah ini. Jenis mesti mematuhi kedua-dua protokol.
Ambil perhatian bahawa komposisi protokol tidak mencipta protokol baharu. Mereka hanya mengisytiharkan gabungan sementara protokol.
Penggunaan Praktikal Protokol
Di manakah anda boleh menggunakan protokol dalam projek iOS anda? Sebagai satu contoh, anda boleh mengisytiharkan protokol untuk mendapatkan semula dan menyimpan tetapan apl:
Berbilang kelas boleh melaksanakan protokol ini dan menyediakan pelaksanaan yang sama sekali berbeza untuk kaedah mereka. Sebagai contoh, satu kelas boleh membaca dan menulis tetapan ke fail setempat:
Kelas lain boleh membaca dan menulis tetapan ke pangkalan data:
Dalam Rajah 1 , bentuk lollipop di tepi kanan setiap kelas menunjukkan ia mengamalkan AppSetting protokol.
![]() |
Rajah 1 - Kelas yang melaksanakan protokol |
Protokol mengisytiharkan tandatangan kaedah yang mesti dilaksanakan oleh kelas untuk menerima pakai protokol, tetapi ia tidak menyatakan kandungan dan tingkah laku kaedah. Ini memberikan fleksibiliti yang luar biasa, membolehkan anda memanjangkan apl anda dengan mudah pada masa hadapan. Sebagai contoh, anda boleh memutuskan untuk menyimpan tetapan apl di web. Anda boleh membuat yang ketiga TetapanInternet kelas, pakai AppSetting protokol, dan anda sudah bersedia untuk pergi!
Dalam Swift, protokol adalah jenis lengkap. Secara praktikal, ini bermakna anda boleh mengisytiharkan pembolehubah sebagai jenis protokol tertentu, dan ia boleh menyimpan rujukan kepada mana-mana kelas yang menggunakan protokol.
Sebagai contoh, kod berikut mengisytiharkan pembolehubah tetapan jenis AppSetting (protokol). Ia kemudian menyimpan contoh daripada SettingsLocalFile kelas dalam pembolehubah, dan selepas itu, contoh daripada SettingsDatabase :
Jika anda menyimpan contoh kelas yang tidak menggunakan protokol AppSetting, ia menghasilkan ralat pengkompil yang mengatakan: Jenis 'x' tidak mematuhi protokol AppSetting .
Anda juga boleh menentukan protokol sebagai jenis tatasusunan atau kamus. Sebagai contoh, anda boleh mengisytiharkan protokol bernama boleh dicapai , dan kemudian buat tatasusunan boleh dicapai objek:
Anda boleh mengisytiharkan protokol dalam fail kelasnya sendiri, atau dalam fail yang sama dengan kelas yang berkaitan. Sebagai contoh, yang UIPickerView kelas mempunyai kaitan UIPickerViewDelegate protokol iaitu protokol yang mentakrifkan kaedah yang perlu dilaksanakan oleh perwakilan. Dalam kes ini, masuk akal untuk mengisytiharkan protokol dalam fail yang sama dengan fail UIPickerView kelas.
Mengembalikan Nilai daripada View Controller
Satu lagi penggunaan praktikal protokol ialah mengembalikan nilai dari satu pengawal pandangan kepada yang lain. Mari kita lihat contoh ini. Untuk mengikutinya, muat turun contoh projek daripada pautan ini .
- Buka iAppsReview projek yang baru anda muat turun.
- Pilih Utama.papan cerita fail dalam Project Navigator. Di bahagian atas sebelah kanan papan cerita ialah adegan yang ditunjukkan dalam Rajah 2 .
![]() |
Rajah 2 - Dua adegan menggunakan Kategori Apl tempat kejadian. |
Apabila anda mengetik Kategori Apl baris di bahagian atas adegan ini, mereka menavigasi ke Kategori Apl tempat kejadian. Apabila anda memilih kategori dalam senarai dan ketik belakang butang, baris di bahagian atas adegan asal memaparkan kategori yang dipilih.
Jadi bagaimana seharusnya Kategori Apl adegan melepasi kategori yang dipilih kembali ke adegan asal?
Mari kita bercakap tentang bagaimana bukan untuk melakukannya dahulu. Rajah 3 menunjukkan penyelesaian yang lemah untuk masalah ini. Dalam contoh ini, apabila pengawal paparan menavigasi ke AppCategoryViewController , ia menyimpan rujukan kepada dirinya sendiri dalam originatingController harta benda.
![]() |
Rajah 3 - Penyelesaian yang lemah! |
Apabila pengguna memilih kategori daripada senarai, AppCategoryViewController menggunakan Swift ialah operator untuk memeriksa jenis pengawal asal. Jika ia TulisUlasan , kemudian ia melaksanakan satu set tindakan untuk mengembalikan kategori yang dipilih. Jika ia Semakan Dalam Talian , ia melaksanakan satu lagi set tindakan.
Apabila saya melakukan semakan kod untuk syarikat perisian, saya melihat banyak pendekatan 'menguji jenis objek dan melaksanakan satu set tindakan'. Ia adalah contoh gandingan yang ketat, iaitu bukan satu perkara yang baik. The AppCategoryViewController tahu terlalu banyak tentang adegan yang menyebutnya. Malah, jika anda menambah adegan baharu pada apl anda yang perlu mengakses senarai kategori, anda mesti menambah satu lagi jika kenyataan dalam AppCategoryViewController untuk menampung adegan baharu (atau mungkin menukarnya kepada a suis kenyataan).
Menggunakan protokol adalah penyelesaian yang lebih baik. Rajah 4 menunjukkan cara protokol boleh digunakan untuk menyelesaikan masalah ini dengan elegan.
![]() |
Rajah 4 - Gunakan protokol untuk penyelesaian yang lebih baik. |
Berikut adalah perkara utama seperti yang dinomborkan dalam rajah kelas:
- The AppCategoryViewController kelas mengisytiharkan protokol bernama AppCategoryDelegate yang mengandungi satu kemas kiniAppCategory kaedah yang mesti dilaksanakan oleh semua pengawal paparan asal.
- The AppCategoryViewController mempunyai a mewakilkan harta yang jenis itu AppCategoryDelegate protokol. Pengawal paparan asal menyimpan rujukan kepada diri mereka sendiri dalam harta ini.
- Apabila kategori apl dipilih daripada senarai, AppCategoryViewController memanggil kemas kiniAppCategory kaedah pada pengawal paparan yang disimpan dalam mewakilkan harta, melepasi yang dipilih CategoryEntity .
- Pengawal pandangan asal kemas kiniAppCategory kaedah dilaksanakan, dan kategori aplikasi yang baru dipilih dipaparkan.
Rajah 5 mengandungi gambar rajah jujukan yang menyediakan pandangan langkah demi langkah tentang cara protokol berfungsi pada masa jalankan.
![]() |
Rajah 5 - Rajah jujukan protokol |
- Pengawal pandangan asal prepareForSegue kaedah dipanggil.
- Pengawal paparan asal menyimpan rujukan kepada dirinya sendiri dalam AppCategoryViewController's mewakilkan harta dan kawalan diserahkan kepada AppCategoryViewController .
- Kategori apl dipilih daripada senarai.
- The AppCategoryViewController memanggil kemas kiniKategori kaedah pada pengawal paparan asal, menghantar rujukan kepada yang dipilih AppCategoryEntity .
Memandangkan anda mempunyai gambaran keseluruhan tentang cara protokol berfungsi, mari lihat kod sebenar yang menjadikan semuanya berlaku.
- Pilih AppCategoryViewController.swift fail dalam Project Navigator.
- Berhampiran bahagian atas fail kod ialah protokol bernama AppCategoryDelegate :
Protokol ini mengisytiharkan satu kemas kiniAppCategory kaedah yang mesti dilaksanakan oleh semua pengawal paparan asal supaya mereka boleh dimaklumkan apabila pengguna memilih kategori apl daripada senarai.
Ini bermakna pengawal paparan asal mesti mempunyai kaedah yang dipanggil kemas kiniAppCategory yang menerima parameter jenis AppCategoryEntity .
- Lihat lebih jauh ke bawah dalam fail kod untuk melihat fail mewakilkan harta:
Perhatikan jenisnya ialah AppCategoryDelegate protokol. Pengawal pandangan asal yang melaksanakan AppCategoryDelegate protokol boleh menyimpan rujukan kepada dirinya sendiri dalam harta ini.
- Tatal ke tableView:didSelectRowAtIndexPath . Kaedah ini dipanggil apabila kategori apl dipilih pada masa jalankan. Berikut ialah baris terakhir kod dalam kaedah ini:
Kod ini memanggil kemas kiniAppCategory kaedah pada objek pengawal paparan asal yang disimpan dalam mewakilkan harta, melepasi yang dipilih AppCategoryEntity .
- Pilih WriteReviewViewController.swift fail dalam Project Navigator. Di bahagian atas fail, pengawal paparan ini menggunakan AppCategoryDelegate protokol:
- The prepareForSegue kaedah dipanggil tepat sebelum menavigasi ke AppCategoryViewController . Dalam baris terakhir kaedah ini, pengawal paparan asal menyimpan rujukan kepada dirinya sendiri dalam harta perwakilan bagi AppCategoryViewController :
- Di bahagian bawah fail adalah pelaksanaan kemas kiniAppCategory kaedah protokol:
Kod ini mengemas kini baris untuk memaparkan AppCategoryEntity berlalu kembali dari AppCategoryViewController .
Menguji Protokol pada Masa Larian
Sekarang mari kita melangkah melalui kod ini pada masa berjalan supaya anda mendapat gambaran yang lebih jelas tentang semua bahagian yang bergerak.
- Di dalam WriteReviewViewController kelas, tambah titik putus pada baris terakhir kod dalam prepareForSegue kaedah ( Rajah 6 ).
![]() |
Rajah 6 - Tetapkan titik putus dalam prepareForSegue . |
- Seterusnya, tetapkan titik putus pada baris pertama kod dalam kaedah updateAppCategory ( Rajah 7 ).
![]() |
Rajah 7 - Tetapkan titik putus dalam kemas kiniAppCategory . |
- Pilih AppCategoryViewController.swift fail dalam Project Navigator. Tetapkan titik putus pada baris terakhir dalam tableView:didSelectRowAtIndexPath: kaedah ( Rajah 8 ).
![]() |
Rajah 8 - Tetapkan titik putus dalam tableView:didSelectRowAtIndexPath:. |
- Tekan Xcode's Lari butang. Apabila apl muncul dalam Simulator, pilih Menulis ulasan pilihan dalam skrin pertama. Ini membawa anda ke Tulis Ulasan adegan ( Rajah 9 ).
![]() |
Rajah 9 - The Tulis Ulasan tempat kejadian |
- Di bahagian atas tempat kejadian, klik pada sel Kategori Apl. Ini menyebabkan titik putus pertama dipukul ( Rajah 6 ) dan juga WriteReviewViewController menyimpan rujukan kepada dirinya sendiri dalam AppCategoryViewController mewakilkan harta benda.
- dalam bar alat Nyahpepijat, klik Teruskan. Ini menavigasi aplikasi ke Kategori Apl adegan ( Rajah 10 ).
![]() |
Rajah 10 - The Kategori Apl tempat kejadian |
- Pilih kategori apl daripada senarai. Apabila anda melakukan ini, anda mencapai titik putus dalam tableView:didSelectRowAtIndexPath: kaedah ( Rajah 8 ). The AppCategoryViewController memanggil kemas kiniAppCategory kaedah pada pengawal paparan yang disimpan di dalamnya mewakilkan harta, melepasi yang dipilih pada masa ini AppCategoryEntity .
- Dalam bar alat Nyahpepijat, klik butang Teruskan. Ini membawa anda ke titik putus dalam pengawal paparan asal kemas kiniAppCategory kaedah ( Rajah 7 ). Kod ini mendapat nama kategori apl yang baru dipilih, menyimpannya dalam baris di bahagian atas tempat kejadian, dan kemudian memberitahu paparan jadual untuk memuatkan semula datanya, yang menyegarkan baris.
- Klik Teruskan dalam bar alat Nyahpepijat. Ini memaparkan adegan Kategori Apl dengan tanda semak di sebelah kategori apl yang baru dipilih ( Rajah 11 ).
![]() |
Rajah 11 - Tanda semak di sebelah item yang dipilih |
- Klik pada belakang butang di bahagian atas Kategori Apl tempat kejadian. Ini membawa anda kembali ke adegan Tulis Ulasan di mana anda boleh melihat kategori yang baru dipilih dipaparkan dalam sel di bahagian atas skrin ( Rajah 12 ).
![]() |
Rajah 12 - Item yang baru dipilih dipaparkan dalam baris di bahagian atas skrin! |
Ini adalah penyelesaian yang bagus, kerana ia berganding longgar. The AppCategoryViewController mengetahui sangat sedikit tentang pengawal pandangan yang memanggilnya. Malah, satu-satunya perkara yang diketahui ialah pengawal pandangan mempunyai kaedah bernama kemas kiniAppCategory yang menerima an AppCategoryEntity parameter. Itu sahaja!
Sekarang pada bila-bila masa anda mempunyai pengawal paparan lain yang perlu menggunakan Kategori Apl adegan, anda tidak perlu membuat sebarang perubahan pada AppCategoryViewController kelas. Itu adalah gandingan longgar.
Penyelesaian elegan ini dibawakan kepada anda oleh protokol Swift!
Kesimpulan
Sebaik sahaja anda mempelajari sintaks, ia memerlukan sedikit usaha untuk mencipta protokol. Hasil dalam fleksibiliti dan masa yang dijimatkan lebih jauh di jalan adalah sangat berbaloi!