Saya mencoba untuk membaca detail implementasi Swift, dan satu hal yang tidak bisa saya pecahkan adalah "tabel saksi" nya. Sepertinya itu adalah pointer vtable terpisah yang digunakan untuk struct.
Tetapi mengapa Anda membutuhkannya? Struct disalin oleh nilai, jadi Anda sudah tahu pada waktu kompilasi jenis apa mereka. Jadi bukankah Anda hanya hard-code metode mana untuk memanggil dan dilakukan dengan itu? Mengapa melakukan pengiriman virtual pada metode ini?
language-design
swift-language
uliwitness
sumber
sumber
Jawaban:
Structs dapat mengimplementasikan antarmuka, yang disebut protokol di Swift. Anda dapat memiliki parameter, variabel, atau bidang / anggota yang merupakan protokol, dan, karena beberapa struct yang berbeda, belum lagi kelas, dapat mengimplementasikan protokol yang sama, setelah Anda lulus (atau menetapkan) struct ke parameter protokol (atau variabel atau bidang), spesifik yang mungkin menjadi "hilang" (re: waktu kompilasi) dan tabel saksi protokol ikut bermain (re: runtime).
Anda dapat mempelajari lebih lanjut tentang tata letak memori Swift .
Hal serupa terjadi pada C #, yang lebih saya kenal. Sebuah struct yang diteruskan atau ditugaskan ke variabel antarmuka atau bidang / anggota dikotak, dan representasi kemas dari struct cocok dengan representasi kelas, yang berarti ada vtable untuk struct kotak.
Saya mengharapkan C # dan Swift untuk melakukan panggilan langsung ketika item diketahui pada waktu kompilasi sebagai struct, dan untuk menggunakan pengiriman vtable ketika pada waktu kompilasi, item tersebut hanya dikenal sebagai antarmuka.
sumber