Saat mencoba memahami suatu program, atau dalam beberapa kasus, berguna untuk dapat benar-benar mengetahui jenis sesuatu itu. Saya tahu debugger dapat menunjukkan kepada Anda beberapa jenis informasi, dan Anda biasanya dapat mengandalkan inferensi tipe untuk lolos dengan tidak menentukan jenis dalam situasi tersebut, tapi tetap saja, saya benar-benar ingin memiliki sesuatu seperti Python.type()
dynamicType (lihat pertanyaan ini )
Pembaruan: ini telah diubah di versi terbaru Swift, obj.dynamicType
sekarang memberi Anda referensi ke tipe dan bukan turunan tipe dinamis.
Yang ini sepertinya yang paling menjanjikan, tapi sejauh ini saya belum bisa menemukan tipe yang sebenarnya
class MyClass {
var count = 0
}
let mc = MyClass()
# update: this now evaluates as true
mc.dynamicType === MyClass.self
Saya juga mencoba menggunakan referensi kelas untuk instantiate objek baru, yang tidak bekerja, tapi anehnya memberi saya sebuah kesalahan mengatakan saya harus menambahkan required
initializer:
bekerja:
class MyClass {
var count = 0
required init() {
}
}
let myClass2 = MyClass.self
let mc2 = MyClass2()
Masih hanya langkah kecil menuju benar-benar menemukan jenis objek yang diberikan sekalipun
edit : Saya telah menghapus sejumlah besar detail yang sekarang tidak relevan - lihat riwayat edit jika Anda tertarik :)
sumber
print(mc)
ataudump(mc)
akan mencetak ringkasan (yang bisa Anda dapatkan daritoString(mc)
ataureflect(mc).summary
), yang akan berisi nama kelas di suatu tempat. Tetapi tidak jelas bagaimana cara mendapatkan nama kelas sendiri.Jawaban:
Versi Swift 3:
sumber
var myVar: SomeType!
. Kompiler memberikan kesalahan "Tidak dapat mengonversi nilai tipe 'SomeType! .Type' (alias 'ImplisitlyUnwrappedOptional <SomeType> .Type') ke tipe argumen yang diharapkan 'AnyClass' (alias 'AnyObject.Type') Kompiler menyarankan menambahkanas! AnyClass
setelah jenis tetapi kemudian Program macet dengan beberapa "EXC_BAD_INSTRUCTION" dan jiberrish lain yang tidak dapat saya pecahkan.String
yang dilewatkan sebagai tipeAny
makatype(of:)
akan ditampilkanAny
, tidakString
.Swift 2.0:
Cara yang tepat untuk melakukan introspeksi jenis ini adalah dengan struct Mirror ,
Kemudian untuk mengakses tipe itu sendiri dari
Mirror
struct Anda akan menggunakan propertisubjectType
seperti:Anda kemudian dapat menggunakan sesuatu seperti ini:
sumber
String
danOptional(String)
tidak sama.The
dynamicType.printClassName
kode dari contoh dalam buku Swift. Tidak mungkin saya tahu untuk langsung mengambil nama kelas khusus, tetapi Anda dapat memeriksa jenis instance menggunakanis
kata kunci seperti yang ditunjukkan di bawah ini. Contoh ini juga menunjukkan bagaimana menerapkan fungsi className kustom, jika Anda benar-benar ingin nama kelas sebagai string.catatan:
bahwa subclass
NSObject
sudah mengimplementasikan fungsi className mereka sendiri. Jika Anda bekerja dengan Cocoa, Anda bisa menggunakan properti ini.sumber
subjectType
tidak lagi tersedia, dandynamicType
menyebabkan pesan penghentian dari kompiler.Pada Xcode 6.0.1 (setidaknya, tidak yakin kapan mereka menambahkannya), contoh asli Anda sekarang berfungsi:
Memperbarui:
Untuk menjawab pertanyaan asli, Anda benar-benar dapat menggunakan runtime Objective-C dengan objek Swift polos berhasil.
Coba yang berikut ini:
sumber
Jika Anda hanya perlu memeriksa apakah variabel bertipe X, atau itu sesuai dengan beberapa protokol, maka Anda dapat menggunakan
is
, atauas?
seperti berikut ini:Ini sama dengan
isKindOfClass
di Obj-C.Dan ini setara dengan
conformsToProtocol
, atauisMemberOfClass
sumber
as?
pemeran bersyarat melakukan hal yang samaisKindOfClass
juga, hanya juga memberikan hasil pemeran jika itu Berhasil.isMemberOfClass
dengan kondisiobject.dynamicType == ClassName.self
.Swift 3:
sumber
is
ada dari sebelum Swift 3 ...?Untuk Swift 3.0
Untuk Swift 2.0 - 2.3
sumber
Berikut adalah 2 cara yang saya sarankan untuk melakukannya:
Atau:
Ini adalah contoh terperinci:
sumber
print( aShape is Square )
,is
operator lebih disukai.Tergantung pada use case. Tapi mari kita asumsikan Anda ingin melakukan sesuatu yang berguna dengan tipe "variabel" Anda.
switch
Pernyataan Swift sangat kuat dan dapat membantu Anda mendapatkan hasil yang Anda cari ...Dalam hal ini, miliki kamus sederhana yang berisi pasangan kunci / nilai yang dapat berupa UInt, Int atau String. Dalam
.filter()
metode pada kamus, saya perlu memastikan saya menguji nilai-nilai dengan benar dan hanya menguji untuk String ketika itu adalah string, dll. Pernyataan beralih membuat ini sederhana dan aman! Dengan menetapkan 9 ke variabel tipe Any, itu membuat saklar untuk mengeksekusi Int. Coba ubah ke:..dan coba lagi. Kali ini mengeksekusi
as String
kasus ini.sumber
Jika Anda mendapat peringatan "selalu benar / gagal", Anda mungkin perlu memberikan peringatan apa pun sebelum menggunakan
is
sumber
sumber