Perhatian: istilah awam di depan.
Penjelasan ini tidak sepenuhnya benar pada tingkat kode yang paling rumit. Namun itu telah ditinjau oleh seorang pria yang benar-benar bekerja pada Swift dan dia mengatakan itu cukup bagus sebagai penjelasan dasar.
Jadi saya ingin mencoba menjawab pertanyaan "mengapa" secara sederhana dan langsung .
Tepatnya: mengapa kita harus menandai fungsi struct seperti mutating
ketika kita dapat mengubah parameter struct tanpa mengubah kata kunci?
Jadi, gambaran besarnya, ini sangat berkaitan dengan filosofi yang membuat Swift cepat.
Anda dapat menganggapnya seperti masalah mengelola alamat fisik yang sebenarnya. Saat Anda mengubah alamat, jika ada banyak orang yang memiliki alamat Anda saat ini, Anda harus memberi tahu mereka semua bahwa Anda telah pindah. Tetapi jika tidak ada yang mengetahui alamat Anda saat ini, Anda dapat pindah ke mana pun Anda mau, dan tidak ada yang perlu tahu.
Dalam situasi ini, Swift seperti kantor pos. Jika banyak orang dengan banyak kontak sering berpindah-pindah, itu memiliki overhead yang sangat tinggi. Itu harus membayar banyak staf untuk menangani semua pemberitahuan itu, dan prosesnya memakan banyak waktu dan usaha. Itulah mengapa negara bagian Swift yang ideal adalah setiap orang di kotanya memiliki kontak sesedikit mungkin. Maka tidak perlu staf besar untuk menangani perubahan alamat, dan itu dapat melakukan segalanya dengan lebih cepat dan lebih baik.
Ini juga mengapa orang-orang Swift mengoceh tentang tipe nilai vs. tipe referensi. Secara alami, jenis referensi mengumpulkan "kontak" di semua tempat, dan jenis nilai biasanya tidak membutuhkan lebih dari pasangan. Jenis nilai adalah "Swift" -er.
Jadi kembali ke gambar kecil: structs
. Struktur adalah masalah besar di Swift karena dapat melakukan sebagian besar hal yang dapat dilakukan objek, tetapi merupakan tipe nilai.
Mari lanjutkan analogi alamat fisik dengan membayangkan a misterStruct
yang hidup someObjectVille
. Analoginya sedikit miring di sini, tetapi saya pikir itu masih membantu.
Jadi untuk memodelkan mengubah variabel pada a struct
, katakanlah misterStruct
memiliki rambut hijau, dan mendapat perintah untuk beralih ke rambut biru. Analoginya menjadi miring, seperti yang saya katakan, tetapi yang terjadi adalah bahwa alih-alih mengganti misterStruct
rambut, orang tua itu pindah dan orang baru dengan rambut biru masuk, dan orang baru itu mulai menyebut dirinya sendiri misterStruct
. Tidak ada yang perlu mendapatkan pemberitahuan perubahan alamat, tetapi jika ada yang melihat alamat itu, mereka akan melihat pria berambut biru.
Sekarang mari kita buat model apa yang terjadi saat Anda memanggil fungsi di a struct
. Dalam hal ini, seperti misterStruct
mendapat perintah seperti changeYourHairBlue()
. Jadi, kantor pos memberikan instruksi untuk misterStruct
"ganti rambut Anda menjadi biru dan beri tahu saya setelah selesai".
Jika dia mengikuti rutinitas yang sama seperti sebelumnya, jika dia melakukan apa yang dia lakukan ketika variabel diubah secara langsung, yang misterStruct
akan dilakukan adalah keluar dari rumahnya sendiri dan memanggil orang baru dengan rambut biru. Tapi itulah masalahnya.
Perintah itu "go mengubah rambut Anda menjadi biru dan katakan ketika Anda sudah selesai," tapi itu adalah hijau orang yang mendapat perintah itu. Setelah pria biru itu pindah, notifikasi "pekerjaan selesai" masih harus dikirim kembali. Tapi pria biru itu tidak tahu apa-apa tentang itu.
[Untuk benar-benar memenangkan analogi ini sesuatu yang mengerikan, yang secara teknis terjadi pada pria berambut hijau adalah setelah dia pindah, dia segera bunuh diri. Jadi dia tidak bisa memberi tahu siapa pun bahwa tugasnya sudah selesai juga! ]
Untuk menghindari masalah ini, dalam kasus seperti ini saja , Swift harus masuk langsung ke rumah di alamat itu dan benar - benar mengganti rambut penghuni saat ini . Itu adalah proses yang sama sekali berbeda dari sekedar mengirim orang baru.
Dan itulah mengapa Swift ingin kami menggunakan mutating
kata kunci!
Hasil akhirnya terlihat sama untuk semua yang harus mengacu pada struktur: penghuni rumah sekarang berambut biru. Tetapi proses untuk mencapainya sebenarnya sangat berbeda. Sepertinya itu melakukan hal yang sama, tetapi melakukan hal yang sangat berbeda. Itu melakukan hal yang tidak pernah dilakukan oleh struktur Swift secara umum.
Jadi untuk memberikan sedikit bantuan kepada compiler yang buruk, dan tidak membuatnya harus mencari tahu apakah suatu fungsi bermutasi struct
atau tidak, dengan sendirinya, untuk setiap fungsi struct yang pernah ada, kita diminta untuk mengasihani dan menggunakan mutating
kata kunci.
Intinya, untuk membantu Swift tetap gesit, kita semua harus melakukan bagian kita. :)
EDIT:
Hei bung / dudette yang meremehkan saya, saya baru saja menulis ulang jawaban saya sepenuhnya . Jika Anda merasa lebih baik, apakah Anda akan menghapus suara negatifnya?