Bandingkan Protokol di Antarmuka Swift vs di Jawa

149

Saya akan mempelajari tutorial iOS dari halaman pengembang Apple .

Menurut saya itu protocoldan interfacehampir memiliki fungsi yang sama.

  • Apakah ada perbedaan di antara keduanya?

  • perbedaan penggunaan dalam proyek?

Diperbarui

Ya , saya memang membaca tautan di atas dan saya masih tidak yakin apa perbedaan dan penggunaan antara protocoldan interface. Ketika saya mengajukan pertanyaan seperti ini, saya ingin melihat penjelasan sederhana tentang topik tersebut. Terkadang sulit untuk mendapatkan semuanya dari dokumentasi.

Sanggul
sumber
1
Protokol dalam Swift dan Antarmuka di Jawa adalah konsep yang sama. Lihat di sini
Vivek Molkar
69
Saya pikir pertanyaan seperti ini tentang perbedaan antar bahasa sangat berguna untuk memahami fitur bahasa. Dan saya tidak berpikir mereka mengarah pada jawaban yang tidak perlu dan tidak mudah untuk menemukan jawabannya di dokumentasi. Jadi saya tidak berpikir suara turun pada pertanyaan ini dibenarkan.
Lii
1
Berikut adalah beberapa poin penting dunia nyata tentang antarmuka Java - stackoverflow.com/a/41143492/294884 - yang akan menjadi kunci bagi siapa saja yang baru menggunakan Swift, mencoba Java
Fattie
Di arah lain, kita harus ingat bahwa alasan utama dari Swift adalah untuk "pemrograman berorientasi protokol". Anda melakukan segalanya dengan "ekstensi protokol" di Swift di mana-mana. Sebagai contoh di sini adalah masalah halus tentang Swift (yaitu: "tentang ekstensi protokol") yang menggambarkan beberapa masalah.
Fattie
2
Dalam Swift, bukan antarmuka, nama protokol digunakan karena dalam file header Objective C (duplikat tidak berguna) dari C disebut antarmuka
Alex78191

Jawaban:

117

Pada dasarnya protokol sangat mirip dengan antarmuka Java kecuali untuk:

  • Protokol Swift juga dapat menentukan properti yang harus diimplementasikan (yaitu bidang)
  • Protokol Swift perlu berurusan dengan nilai / referensi melalui penggunaan kata kunci yang bermutasi (karena protokol dapat diimplementasikan oleh struct dan kelas)
  • Anda dapat menggabungkan protokol kapan saja dengan kata kunci protokol <>. Misalnya, mendeklarasikan parameter fungsi yang harus mematuhi protokol A dan B sebagai:

.

func foo ( var1 : protocol<A, B> ){}

Ini adalah perbedaan langsung yang jelas untuk pengembang Java (atau setidaknya apa yang saya lihat sejauh ini).

Thomas Schar
sumber
13
" protokol <> kata kunci ": Itu sangat keren! Saya pikir inilah yang disebut tipe persimpangan dalam komunitas teori sistem tipe. Saya Java, Anda hanya dapat memiliki tipe seperti itu untuk parameter tipe dengan banyak batas. Makalah ini menyarankan untuk memperkenalkan mereka di Jawa sebagai tipe kelas pertama, dengan sintaks untuk menunjukkannya.
Lii
7
Ringkasan yang bagus. Beberapa fitur yang lebih penting: Protokol Swift juga dapat menentukan persyaratan tipe terkait — mis. Tipe koleksi memiliki tipe indeks terkait, atau metode perbandingan tipe yang sebanding memerlukan parameter dari tipe yang sama. Dan di Swift 2.0, ekstensi protokol dapat menambahkan fungsionalitas aktual ke tipe yang memenuhi persyaratan protokol.
rickster
2
@rickster Java 8 juga dapat menambahkan implementasi ke antarmuka dengan menandai metode dengan default kata kunci . Lihat Tutorial Oracle .
Basil Bourque
5
Protokol <> kata kunci sekarang telah dihapus demi ampersand. Jadi, Anda dapat menulis: biarkan c: A & B
Paul Robinson
2
Dalam Swift, bukan antarmuka, nama protokol digunakan karena dalam file header Objective C (duplikat tidak berguna) dari C disebut antarmuka
Alex78191
33

Melengkapi jawaban @Thomas Schar. Magic protokol Swift berasal dari ekstensi.

  • Protokol Swift bisa mendapatkan implementasi melalui ekstensi (Swift
    2). Antarmuka Java 8 dapat memiliki implementasi standar, tetapi tidak dapat dilakukan "secara surut."
  • Di Swift, Anda dapat "secara surut" menambahkan persyaratan protokol (dan
    implementasinya jika perlu) ke kelas atau struktur apa pun.
  • Protokol Swift tidak mengikuti pola kustomisasi generik (yaitu <..>), tetapi skema typealias (mis. Jenis Terkait). Dapat membingungkan pada awalnya, tetapi dapat menghindari
    "sudut braket kebutaan" dalam beberapa kasus.
  • Swift memiliki pencocokan pola tipe lanjutan, memungkinkan untuk menjadi sangat spesifik di mana dan bagaimana persyaratan protokol dan ekstensi diterapkan. Ini bisa membingungkan ketika datang dari Jawa, tetapi memiliki banyak kekuatan.
  • Protokol cepat dapat dibuat untuk properti / param (mis. Celebrator: protokol)

Satu hal yang membuat saya menggaruk-garuk kepala selama beberapa jam adalah tidak semua protokol dapat digunakan sebagai tipe properti. Misalnya, jika Anda memiliki protokol dengan typealias, Anda tidak dapat langsung menggunakannya sebagai jenis properti (masuk akal ketika Anda memikirkannya, tetapi berasal dari Jawa kami benar-benar ingin memiliki properti seperti userDao: IDao).

Jeremy Chone
sumber
7
Protokol Swift juga dapat memiliki anggota opsional, tidak seperti antarmuka Java.
eyeApps LLC
4
Poin kecil yang selalu muncul di Swift adalah, tidak ada (aneh) tidak ada fungsi abstrak, jadi Anda hanya pergi "cetak Anda lupa yang satu ini!" ... stackoverflow.com/a/24111430/294884
Fattie
@ Fat Anda dapat menggunakan kata kunci "wajib" pada suatu fungsi untuk menentukannya membutuhkan implementasi subkelas. Jadi sungguh, lebih seperti ketidaktahuan kecil daripada titik yang sebenarnya.
Dirk Bester
@ DashBester - Cheers - tunggu, Anda bicarakan dengan inisialisasi ??
Fattie
Sekali lagi @ DashBester Saya mungkin memiliki beberapa kebingungan tetapi seseorang tidak dapat menggunakan requiredsebelum fungsi dalam protokol, Anda hanya mendapatkan 'required' may only be used on 'init' declarations...
Fattie