Dari buku Apple "Salah satu perbedaan paling penting antara struktur dan kelas adalah bahwa struktur selalu disalin ketika mereka diedarkan dalam kode Anda, tetapi kelas dilewatkan dengan referensi."
Adakah yang bisa membantu saya memahami apa artinya itu? Bagi saya, kelas dan struct tampaknya sama.
void my_func(int a)
vsvoid my_func(int &a)
. Ini adalah pertanyaan pemrograman yang sangat mendasar. Baca lebih lanjut: stackoverflow.com/questions/373419/…Jawaban:
Berikut ini contoh dengan a
class
. Perhatikan bagaimana ketika nama diubah, instance yang dirujuk oleh kedua variabel diperbarui.Bob
sekarangSue
, di mana-mana yangBob
pernah dirujuk.Dan sekarang dengan
struct
kita melihat bahwa nilai-nilai disalin dan masing-masing variabel menjaga set nilainya sendiri. Ketika kami mengatur namaSue
,Bob
struct diaStruct
tidak bisa diubah.Jadi untuk mewakili entitas kompleks stateful, a
class
mengagumkan. Tetapi untuk nilai yang hanya berupa pengukuran atau bit data terkait, astruct
lebih masuk akal sehingga Anda dapat dengan mudah menyalinnya dan menghitungnya atau memodifikasi nilai tanpa takut efek samping.sumber
aStruct and bStruct are two structs with the same value!
membingungkan saya karena nilai-nilai variabel di dalam struct berbeda.aStruct
danbStruct
memiliki nilai yang identik. Mereka berdua memiliki satuname
bidang yang diatur"Bob"
. Tetapi mereka adalah dua struct yang berbeda. Ini terbukti pada baris berikutnya ketika Anda dapat mengubah nama salah satu struct, dan yang lainnya tetap tidak berubah.Kelas dan struktur dapat melakukan:
Hanya kelas yang dapat melakukan:
sumber
struct
adalah tipe nilai. Ini berarti bahwa jika Anda menyalin contoh struktur ke variabel lain, itu hanya disalin ke variabel.Contoh untuk Tipe Nilai
Kelas adalah tipe referensi. Ini berarti bahwa jika Anda menetapkan instance kelas ke variabel, itu hanya akan menampung referensi ke instance dan bukan salinannya .
sumber
Jawaban di atas benar Saya harap jawaban saya akan membantu seseorang yang tidak mengerti jawaban di atas.
Nah di Swift Ada dua jenis objek
Perbedaan utama di antara mereka adalah
Misalnya kode di sini untuk mengerti dengan baik.
Ini adalah perbedaan utama tetapi kami juga memiliki beberapa perbedaan.
Kelas
Struct
sumber
Pertanyaan ini tampaknya duplikat tetapi terlepas dari, yang berikut ini akan menjawab sebagian besar kasus penggunaan:
Salah satu perbedaan paling penting antara struktur dan kelas adalah bahwa struktur adalah tipe nilai dan selalu disalin ketika mereka diedarkan dalam kode Anda, dan kelas adalah tipe referensi dan diteruskan dengan referensi.
Juga, kelas memiliki Warisan yang memungkinkan satu kelas mewarisi karakteristik yang lain.
Properti Struct disimpan di Stack dan instance Class disimpan di Heap karenanya, kadang-kadang stack secara drastis lebih cepat daripada kelas.
Struct mendapatkan initializer default secara otomatis sedangkan di Class, kita harus menginisialisasi.
Struct aman utas atau tunggal pada suatu saat
Dan juga, Untuk meringkas perbedaan antara struct dan kelas, perlu untuk memahami perbedaan antara nilai dan tipe referensi.
// sampleplayground.playground
Keluaran:
sumber
Jika Anda melihat lebih jauh dalam buku pegangan apel Anda akan melihat bagian ini: "Struktur dan Penghitungan Adalah Jenis Nilai"
Di bagian ini Anda akan melihat ini:
Ini adalah perbedaan terbesar antara struct dan kelas. Struct disalin dan kelas direferensikan.
sumber
Biasanya (dalam sebagian besar bahasa pemrograman), objek adalah blok data yang disimpan di heap, dan kemudian referensi (biasanya pointer) ke blok ini, berisi
name
yang digunakan untuk mengakses blok data ini. Mekanisme ini memungkinkan berbagi objek di heap dengan menyalin nilai referensi mereka (pointer). Ini bukan kasus tipe data dasar seperti Integer, dan itu karena memori yang diperlukan untuk membuat referensi hampir sama dengan objek (dalam hal ini nilai integer). Dengan demikian, mereka akan dilewatkan sebagai nilai bukan sebagai referensi dalam kasus objek besar.Swift menggunakan struct untuk meningkatkan kinerja bahkan dengan objek String dan Array.
Bacaan yang sangat bagus di sini
sumber
Untuk memahami perbedaan antara Structs dan Classes, kita perlu mengetahui perbedaan utama antara nilai dan tipe referensi. Structs adalah tipe nilai dan itu berarti bahwa setiap perubahan pada mereka hanya akan mengubah nilai itu, Kelas adalah tipe referensi dan setiap perubahan dalam tipe referensi akan mengubah nilai yang dialokasikan di tempat memori atau referensi itu. Sebagai contoh:
Mari kita mulai dengan Kelas, kelas ini sesuai dengan Equatable hanya untuk dapat membandingkan contoh, kita membuat instance yang dipanggil
pointClassInstanceA
dan lainnya yang disebutpointClassInstanceB
kita menugaskan kelas A ke kelas B, sekarang pernyataan mengatakan bahwa mereka adalah sama ...Ok, apa yang terjadi di sini mengapa jika kita hanya mengubah nilai x dari pointsClassInstanceB juga mengubah nilai x dari pointClassInstanceA? baik, ini menunjukkan bagaimana tipe referensi bekerja, ketika kita menetapkan instance A, sebagai nilai instance B dan kemudian kita memodifikasi X salah satunya, itu akan mengubah kedua X karena mereka berbagi referensi yang sama dan apa yang berubah adalah nilai dari itu referensi.
Mari kita lakukan hal yang sama tetapi dengan sebuah struct
Kami pada dasarnya memiliki struktur yang sama dengan kelas kami, tetapi sekarang Anda dapat melihat bahwa ketika Anda mencetak nilai x pointStructInstanceA hal ini tidak berubah, dan ini karena tipe nilai bekerja secara berbeda dan setiap perubahan pada salah satu instance mereka akan menjadi " independen "dan tidak akan mempengaruhi yang lain.
Swift menyarankan untuk menggunakan lebih banyak tipe nilai dan Anda dapat mengatakan bahwa pustaka mereka didasarkan pada struct untuk menghindari masalah yang dibawa oleh tipe referensi, seperti memodifikasi nilai secara tidak sengaja dll. Structs adalah cara untuk melanjutkan Swift. Semoga ini bisa membantu.
sumber
Berikut adalah contoh yang menunjukkan perbedaan antara struct dan kelas secara tepat.
tangkapan layar kode tertulis di taman bermain
sumber
sumber
Tipe cepat
Nilai Type :
Struct
,Enum
,Tuple
struct String
,struct Array
(Set
,Dictionary
)value type
baru copy data dibuat. Sebenarnyacopy on write
-COW
mekanisme digunakan dengan beberapa optimisasi, misalnya salinan dibuat ketika objek diubahReferensi Type :
Class
,Function
reference type
sebuah referensi baru untuk contoh asli akan dibuat (alamat misalnya disalin).Value type
disarankan untuk digunakan secara default . Keuntungan terbesarValue type
adalah biasanya merekathread safe
Reference type
Pro:deinit()
dapat digunakan,===
,Objective-C
interoperabilitas karenaValue Type
diperkenalkan di Swift.[Lebih lanjut tentang Mutabilitas]
Memilih Antara Struktur dan Kelas
Tipe
Kelas dan Struktur
sumber
Alreday ada banyak yang ditulis tentang ini, saya ingin menambahkan analogi di sana. Harap Anda tidak akan pernah memiliki keraguan dalam pikiran setelah ini: Intinya: kelas dilewati oleh referensi sedangkan struct dilewatkan oleh nilai.
Misalkan Anda berbagi lembar google doc dengan teman Anda. Sekarang jika dia mengubah apa pun di dalamnya, Anda juga akan melihat bahwa perubahan di google doc Anda, berarti salinan Anda juga terpengaruh. Itu pada dasarnya " disahkan oleh referensi ".
Tapi anggaplah, jika Anda memiliki .XLS fie disimpan di mesin Anda. Anda memberikan file itu kepada teman Anda. Sekarang jika dia membuat perubahan pada file itu, file Anda tidak akan kacau / terpengaruh karena Anda memiliki salinan Anda sendiri. Itu pada dasarnya " dilewati oleh nilai ". Anda memiliki beberapa program sederhana yang sudah ada di sana untuk memeriksa analogi ini di taman bermain cepat.
sumber