Apakah Swift mendukung refleksi? misalnya apakah ada sesuatu seperti valueForKeyPath:
dan setValue:forKeyPath:
untuk objek Swift?
Sebenarnya apakah itu bahkan memiliki sistem tipe dinamis, seperti obj.class
di Objective-C?
ios
reflection
swift
Khanh Nguyen
sumber
sumber
Jawaban:
Sepertinya ada awal dari beberapa dukungan refleksi:
Dari mchambers gist, di sini: https://gist.github.com/mchambers/fb9da554898dae3e54f2
sumber
Mirror
sebenarnya mengutip kata tersebutIDE
beberapa kali._stdlib_getTypeName
dapat membantu.Jika sebuah kelas diperluas
NSObject
, maka semua introspeksi dan dinamisme Objective-C akan berfungsi. Ini termasuk:Satu kekurangan dari fungsionalitas ini adalah dukungan untuk tipe nilai opsional Swift. Misalnya properti Int dapat dihitung dan dimodifikasi tetapi Int? properti tidak bisa. Jenis opsional dapat disebutkan sebagian menggunakan reflect / MirrorType, tetapi masih tidak dimodifikasi.
Jika sebuah kelas tidak diperluas
NSObject
, maka hanya refleksi baru yang sangat terbatas (dan sedang dalam proses?) Yang berfungsi (lihat reflect / MirrorType), yang menambahkan kemampuan terbatas untuk menanyakan instance tentang kelas dan propertinya, tetapi tidak ada fitur tambahan di atas .Saat tidak memperluas NSObject, atau menggunakan direktif '@objc', Swift secara default menggunakan pengiriman berbasis statis dan vtable. Ini lebih cepat, bagaimanapun, dengan tidak adanya mesin virtual tidak memungkinkan intersepsi metode runtime. Intersepsi ini merupakan bagian fundamental dari Kakao dan diperlukan untuk jenis fitur berikut:
Oleh karena itu, disarankan agar klas dalam aplikasi Cocoa / CocoaTouch diimplementasikan dengan Swift:
Ringkasan:
Data referensi: Overhead eksekusi untuk pemanggilan metode:
(kinerja sebenarnya bergantung pada perangkat keras, tetapi rasionya akan tetap sama).
Selain itu, atribut dynamic memungkinkan kita untuk secara eksplisit menginstruksikan Swift bahwa suatu metode harus menggunakan pengiriman dinamis, dan oleh karena itu akan mendukung intersepsi.
sumber
Dokumentasi berbicara tentang sistem tipe dinamis, terutama tentang
Type
dandynamicType
Lihat Jenis Metatype (dalam Referensi Bahasa)
Contoh:
Sekarang dengan asumsi
TestObject
meluasNSObject
Saat ini, belum ada refleksi yang dilaksanakan.
EDIT: Saya ternyata salah, lihat jawaban stevex. Ada beberapa refleksi sederhana hanya baca untuk properti yang dibangun, mungkin untuk memungkinkan IDE memeriksa konten objek.
sumber
Tampaknya API refleksi Swift saat ini bukan prioritas utama Apple. Tapi selain jawaban @stevex ada fungsi lain di perpustakaan standar yang membantu.
Pada beta 6
_stdlib_getTypeName
mendapatkan nama jenis variabel yang rusak. Rekatkan ini ke taman bermain kosong:Outputnya adalah:
Entri blog Ewan Swick membantu menguraikan string berikut:
misalnya
_TtSi
singkatan dari internal SwiftInt
tipe .Mike Ash memiliki entri blog yang bagus yang membahas topik yang sama .
sumber
Anda mungkin ingin mempertimbangkan untuk menggunakan toString () sebagai gantinya. Ini publik dan berfungsi sama seperti _stdlib_getTypeName () dengan perbedaan bahwa itu juga berfungsi di AnyClass , misalnya di Playground enter
sumber
Tidak ada
reflect
kata kunci di Swift 5, sekarang Anda dapat menggunakansumber
json
deserialisasi