Temukan bagaimana Swift menentukan eksekusi metode saat runtime, meningkatkan pemahaman Anda tentang performa dan efisiensi kode.Temukan bagaimana Swift menentukan eksekusi metode saat runtime, meningkatkan pemahaman Anda tentang performa dan efisiensi kode.

Panduan Pelancong untuk Pengiriman Metode di Swift

2025/12/03 06:18
durasi baca 4 menit
Untuk memberikan masukan atau menyampaikan kekhawatiran terkait konten ini, silakan hubungi kami di [email protected]

Pendahuluan

Pengiriman metode adalah algoritma yang digunakan untuk memilih metode yang tepat yang perlu dipanggil saat pemanggilan. Tujuan utama pengiriman metode adalah untuk memberikan program informasi tentang di mana dapat menemukan kode yang dapat dieksekusi untuk metode tertentu dalam memori.

Jenis Pengiriman Metode

Bahasa yang dikompilasi memiliki tiga jenis pengiriman metode:

  • Pengiriman statis atau langsung
  • Pengiriman tabel atau virtual
  • Pengiriman pesan

Pengiriman Statis

Pengiriman statis adalah metode pengiriman tercepat di Swift. Karena tidak ada penggantian metode yang tersedia, hanya ada satu implementasi metode, dan berada di satu lokasi dalam memori.

\ Kita dapat menggunakan pengiriman statis menggunakan kata kunci seperti static ,final, private.

\ Pengiriman statis adalah pengiriman metode default untuk tipe nilai karena tipe nilai tidak dapat diganti.

\ Mari kita lihat beberapa contoh:

Kata Kunci Final

Setelah kita menambahkan kata kunci final ke kelas, metodenya tidak mendukung penggantian, dan inilah saat pengiriman statis berperan.

// MARK: Final class final class ClassExample { // MARK: Static dispatch func method() { // implementation ... } }

Ekstensi Protokol

Setelah Anda menambahkan implementasi default protokol menggunakan ekstensi, metode pengirimannya beralih ke pengiriman statis alih-alih menggunakan Tabel Saksi.

// MARK: Prorocol Extension extension ProtocolExample { // MARK: Direct Dispatch func method() { // implementation ... } } class ClassExample2: ProtocolExample {} let classExample2 = ClassExample2() classExample2.method()

Ekstensi Kelas

Ketika metode diimplementasikan dalam ekstensi, itu berarti tidak dapat diganti oleh subkelas. Dalam hal ini, ada ruang untuk pengiriman statis.

// MARK: Example Class Extension class ClassExample3 {} extension ClassExample3 { // MARK: Direct Dispatch func method() { // implementation ... } } let classExample3 = ClassExample3() classExample3.method()

Kontrol Akses

Kita tidak dapat mengakses metode private di luar badan kelas. Ini berarti bahwa metode tersebut tidak dapat diganti dan menggunakan pengiriman statis.

// MARK: Access Control class ClassExample4 { // MARK: Direct Dispatch private func method() { // implementation ... } }

Pengiriman Tabel

Pengiriman tabel digunakan ketika kita harus berurusan dengan pewarisan. Ini adalah jenis pengiriman default yang digunakan di Swift.

Tabel Virtual

Untuk setiap instance kelas atau subkelas, tabel virtual dibuat yang berisi informasi tentang metode yang diimplementasikan untuk setiap kelas dan menyimpan referensi ke implementasi yang sesuai. Kerugian utama dari pengiriman tabel virtual adalah memiliki kecepatan yang lebih rendah daripada pengiriman statis.

\ Mari kita lihat contohnya:

// MARK: Virtual Table class ParentClass { func method1() {} func methdod2() {} } class ChildClass: ParentClass { override func method1() {} func method3() {} }

\ Untuk setiap instance, tabel virtualnya sendiri dibuat sebagai berikut:

\

Tabel Saksi

Tabel Saksi digunakan oleh protokol dan dibuat untuk setiap kelas yang sesuai dengan protokol. CPU menggunakan tabel ini untuk menentukan di mana harus mencari implementasi yang sesuai. Setiap tipe (nilai dan referensi) yang sesuai dengan protokol memiliki Tabel Saksi Protokol sendiri, yang berisi pointer ke metode tipe yang diperlukan oleh protokol.

\ Mari kita lihat contohnya:

// MARK: Witness Table Dispatch protocol ProtocolExample { func method1() func method2() } class ClassExample1: ProtocolExample { func method1() {} func method2() {} } class ClassExample2: ProtocolExample { func method1() {} func method2() {} }

\ Dalam hal ini, tabel saksi dibuat untuk setiap kelas:

\

Pengiriman Pesan

Pengiriman Pesan adalah gaya pengiriman metode yang paling dinamis. Ini mencari implementasi yang sesuai selama runtime. Karena beroperasi selama runtime, kita dapat menggunakan Method Swizzling untuk mengubah implementasi metode.

\ Jika Anda ingin menggunakan pengiriman pesan, Anda perlu menambahkan @objc dynamic sebelum implementasi metode.

// MARK: Message Dispatch class ClassExample: NSObject { @objc dynamic func method() {} } class SubClassExample: ClassExample { @objc dynamic override func method() {} } let subclass = SubClassExample() subclass.method()

\ Implementasi metode dicari dalam SubClassExample. Jika tidak ada implementasi metode ini di kelas tersebut, pencarian berlanjut di kelas induk, dan seterusnya sampai mencapai NSObject.

\

Mari kita gabungkan semua jenis ke dalam satu tabel:

\

Kesimpulan

Singkatnya, pengiriman metode di Swift adalah aspek kritis dari eksekusi kode, memengaruhi kinerja dan fleksibilitas. Dengan memilih metode pengiriman yang tepat, pengembang dapat mengoptimalkan kode mereka, memastikan kemampuan beradaptasi, dan memanfaatkan fitur dinamis Swift secara efektif. Memahami dan menguasai pengiriman metode sangat penting untuk membangun aplikasi Swift yang efisien dan dapat beradaptasi.

Penafian: Artikel yang diterbitkan ulang di situs web ini bersumber dari platform publik dan disediakan hanya sebagai informasi. Artikel tersebut belum tentu mencerminkan pandangan MEXC. Seluruh hak cipta tetap dimiliki oleh penulis aslinya. Jika Anda meyakini bahwa ada konten yang melanggar hak pihak ketiga, silakan hubungi [email protected] agar konten tersebut dihapus. MEXC tidak menjamin keakuratan, kelengkapan, atau keaktualan konten dan tidak bertanggung jawab atas tindakan apa pun yang dilakukan berdasarkan informasi yang diberikan. Konten tersebut bukan merupakan saran keuangan, hukum, atau profesional lainnya, juga tidak boleh dianggap sebagai rekomendasi atau dukungan oleh MEXC.