Apakah ada cara untuk mencetak tipe runtime dari suatu variabel di swift? Sebagai contoh:
var now = NSDate()
var soon = now.dateByAddingTimeInterval(5.0)
println("\(now.dynamicType)")
// Prints "(Metatype)"
println("\(now.dynamicType.description()")
// Prints "__NSDate" since objective-c Class objects have a "description" selector
println("\(soon.dynamicType.description()")
// Compile-time error since ImplicitlyUnwrappedOptional<NSDate> has no "description" method
Dalam contoh di atas, saya mencari cara untuk menunjukkan bahwa variabel "segera" adalah tipe ImplicitlyUnwrappedOptional<NSDate>
, atau setidaknya NSDate!
.
Jawaban:
Pembaruan September 2016
Swift 3.0: Gunakan
type(of:)
, mis.type(of: someThing)
(KarenadynamicType
kata kunci telah dihapus)Pembaruan Oktober 2015 :
Saya memperbarui contoh di bawah ini ke sintaks Swift 2.0 yang baru (mis.
println
Diganti denganprint
,toString()
sekarangString()
).Dari catatan rilis Xcode 6.3 :
@nschum menunjukkan dalam komentar bahwa catatan rilis Xcode 6.3 menunjukkan cara lain:
Output yang mana:
Pembaruan untuk Xcode 6.3:
Anda dapat menggunakan
_stdlib_getDemangledTypeName()
:dan dapatkan ini sebagai output:
Jawaban asli:
Sebelum Xcode 6.3
_stdlib_getTypeName
mendapat nama jenis variabel yang sudah diaduk. Entri blog Ewan Swick membantu menguraikan string ini:misalnya
_TtSi
singkatan dariInt
tipe internal Swift .Mike Ash memiliki entri blog yang bagus yang membahas topik yang sama .
sumber
_stdlib_getTypeName()
? REPL terintegrasi tidak lagi ada,swift-ide-test
juga tidak ada, dan pencetakan Xcode untuk modul Swift menghilangkan_
nilai-nilai yang sebelumnya.lldb
cukup mudah di repl. Ada juga_stdlib_getDemangledTypeName()
, dan_stdlib_demangleName()
.image
itu jalan pintastarget modules
. Saya akhirnya menggunakantarget modules lookup -r -n _stdlib_
, yang tentu saja lebih baik dinyatakan sebagaiimage lookup -r -n _stdlib_ libswiftCore.dylib
dynamicType
kunci telah dihapus dari Swift. Sebagai gantinya fungsi primitif barutype(of:)
telah ditambahkan ke bahasa: github.com/apple/swift/blob/master/CHANGELOG.mdSunting: Fungsi baru telah diperkenalkan di Swift 1.2 (Xcode 6.3) .
toString
Anda sekarang dapat mencetak tipe demangled dari jenis apa pun menggunakan
.self
dan contoh apa pun menggunakan.dynamicType
:Coba panggil
YourClass.self
danyourObject.dynamicType
.Referensi: https://devforums.apple.com/thread/227425 .
sumber
someInstance.dynamicType.printClassName()
akan mencetak nama kelas.Swift 3.0
sumber
Apakah ini yang Anda cari?
Mencetak "__NSDate"
UPDATE : Harap dicatat ini sepertinya tidak lagi berfungsi pada Beta05
sumber
Xcode saya saat ini adalah Versi 6.0 (6A280e).
Keluaran:
sumber
Optional(...)
, sehingga kode Anda hanya akan kembaliOptional
sebagai Jenis. Itu juga harus ditampilkanvar optionalTestVar: Person? = Person(name:"Sarah")
sebagai Opsional (Person) dan var with Person! as ImplisitlyUnwrappedOptional (Person)Pada Xcode 6.3 dengan Swift 1.2, Anda cukup mengkonversi nilai tipe menjadi demangled penuh
String
.sumber
Anda masih dapat mengakses kelas, melalui
className
(yang mengembalikan aString
).Sebenarnya ada beberapa cara untuk mendapatkan kelas, misalnya
classForArchiver
,classForCoder
,classForKeyedArchiver
(semua kembaliAnyClass!
).Anda tidak bisa mendapatkan tipe primitif (primitif bukan kelas).
Contoh:
Jika Anda ingin mendapatkan jenis primitif, Anda harus menggunakannya
bridgeToObjectiveC()
. Contoh:sumber
import Cocoa
.className
adalah bagian dari dukungan AppleScript Cocoa dan jelas tidak boleh digunakan untuk introspeksi umum. Jelas itu tidak tersedia di iOS.Anda dapat menggunakan pantulan untuk mendapatkan informasi tentang objek.
Misalnya nama kelas objek:
sumber
reflect(x).summary
- terima kasih!Saya beruntung dengan:
sumber
Xcode 8 Swift 3.0 menggunakan tipe (dari :)
sumber
Di Xcode 8, Swift 3.0
Langkah:
1. Dapatkan Jenis:
Pilihan 1:
Pilihan 2:
2. Konversi Jenis ke String:
sumber
Dalam Swift 3.0, Anda dapat menggunakan
type(of:)
, sebagaidynamicType
kata kunci telah dihapus.sumber
SWIFT 5
Dengan rilis terbaru dari Swift 3 kita bisa mendapatkan deskripsi yang cukup tentang nama-nama jenis melalui
String
penginisialisasi. Seperti, misalnyaprint(String(describing: type(of: object)))
. Di manaobject
bisa menjadi variabel instan seperti array, kamus, anInt
, aNSDate
, instance dari kelas kustom, dll.Inilah jawaban lengkap saya: Dapatkan nama kelas objek sebagai string di Swift
Pertanyaan itu sedang mencari cara untuk mendapatkan nama kelas dari suatu objek sebagai string tetapi, juga saya mengusulkan cara lain untuk mendapatkan nama kelas dari variabel yang bukan subkelas
NSObject
. Ini dia:Saya membuat fungsi statis yang mengambil sebagai parameter objek bertipe
Any
dan mengembalikan nama kelasnya sebagaiString
:).Saya menguji fungsi ini dengan beberapa variabel seperti:
dan hasilnya adalah:
sumber
Saat menggunakan Cocoa (bukan CocoaTouch), Anda bisa menggunakan
className
properti untuk objek yang merupakan subkelas dari NSObject.Properti ini tidak tersedia untuk objek Swift normal, yang bukan subclass dari NSObject (dan pada kenyataannya, tidak ada id root atau tipe objek di Swift).
Di CocoaTouch, saat ini tidak ada cara untuk mendapatkan deskripsi string dari jenis variabel yang diberikan. Fungsi serupa juga tidak ada untuk tipe primitif di Cocoa atau CocoaTouch.
Swift REPL mampu mencetak ringkasan nilai termasuk jenisnya, jadi ada kemungkinan introspeksi seperti ini akan dimungkinkan melalui API di masa mendatang.
EDIT :
dump(object)
sepertinya melakukan trik.sumber
dump(object)
sangat kuat. Terima kasih.Jawaban teratas tidak memiliki contoh kerja tentang cara baru dalam menggunakan ini
type(of:
. Jadi untuk membantu pemula seperti saya, ini adalah contoh kerja, diambil sebagian besar dari dokumen Apple di sini - https://developer.apple.com/documentation/swift/2885064-typesumber
Saya sudah mencoba beberapa jawaban lain di sini tetapi jarak tempuh tampaknya sangat pada apa objek bawahan itu.
Namun saya menemukan cara Anda bisa mendapatkan nama kelas Object-C untuk objek dengan melakukan hal berikut:
Berikut ini dan contoh bagaimana Anda akan menggunakannya:
Dalam hal ini akan mencetak NSDate di konsol.
sumber
Saya menemukan solusi ini yang semoga dapat bekerja untuk orang lain. Saya membuat metode kelas untuk mengakses nilai. Harap diingat bahwa ini hanya akan berfungsi untuk subkelas NSObject. Tapi setidaknya itu solusi yang bersih dan rapi.
sumber
Di XCode 6.3 terbaru dengan Swift 1.2, ini adalah satu-satunya cara yang saya temukan:
sumber
<swift module name>.<actual class name>
, jadi Anda ingin membagi string dengan a.
dan mendapatkan token terakhir.Banyak jawaban di sini tidak berfungsi dengan Swift terbaru (Xcode 7.1.1 pada saat penulisan).
Cara saat ini untuk mendapatkan informasi adalah dengan membuat
Mirror
dan menginterogasinya. Untuk nama kelasnya sesederhana:Informasi tambahan tentang objek juga dapat diambil dari
Mirror
. Lihat http://swiftdoc.org/v2.1/type/Mirror/ untuk detailnya.sumber
Di lldb pada beta 5, Anda bisa melihat kelas objek dengan perintah:
yang menghasilkan sesuatu seperti:
Perintah diperluas berarti sesuatu seperti:
Frame Variable
(cetak variabel bingkai)-d run_target
(perluas jenis dinamis)Sesuatu yang berguna untuk diketahui adalah bahwa menggunakan "Frame Variable" untuk menampilkan nilai variabel menjamin tidak ada kode yang dieksekusi.
sumber
Saya telah menemukan solusi untuk kelas yang dikembangkan sendiri (atau Anda dapat mengaksesnya).
Tempatkan properti yang dihitung berikut dalam definisi kelas objek Anda:
Sekarang Anda cukup memanggil nama kelas pada objek Anda seperti:
Harap dicatat bahwa ini hanya akan berfungsi jika definisi kelas Anda dibuat di dalam file yang diberi nama persis seperti kelas yang Anda inginkan.
Karena ini adalah kasus yang umum , jawaban di atas harus melakukannya untuk kebanyakan kasus . Tetapi dalam beberapa kasus khusus Anda mungkin perlu mencari solusi yang berbeda.
Jika Anda membutuhkan nama kelas di dalam kelas (file) itu sendiri, Anda cukup menggunakan baris ini:
Mungkin metode ini membantu beberapa orang di luar sana.
sumber
Berdasarkan jawaban dan komentar yang diberikan oleh Klass dan Kevin Ballard di atas, saya akan menjawab:
yang akan dicetak:
sumber
toString(self.dynamicType).componentsSeparatedByString(".").last!
:, jelas saya berada dalam konteks objek dan dapat referensiself
.sumber
Versi cepat 4:
Terima kasih @Joshua Dance
sumber
Swift 4:
Pemakaian:
sumber
Tampaknya tidak ada cara umum untuk mencetak nama jenis dari jenis nilai arbitrer. Seperti yang telah dicatat orang lain, untuk instance kelas Anda dapat mencetak
value.className
tetapi untuk nilai-nilai primitif tampak bahwa pada saat runtime, informasi jenis hilang.Misalnya, sepertinya tidak ada cara untuk mengetik:
1.something()
dan keluarInt
dengan nilai berapa punsomething
. (Anda dapat, sebagai jawaban lain menyarankan, penggunaani.bridgeToObjectiveC().className
untuk memberikan petunjuk, tetapi__NSCFNumber
adalah tidak benar-benar jenisi
-. Hanya apa yang akan dikonversi ke ketika melintasi batas fungsi Objective-C panggilan)Saya akan dengan senang hati terbukti salah, tetapi sepertinya pemeriksaan tipe dilakukan pada waktu kompilasi, dan seperti C ++ (dengan RTTI dinonaktifkan) banyak dari tipe informasi hilang saat runtime.
sumber
Ini adalah bagaimana Anda mendapatkan string tipe objek Anda atau Tipe yang konsisten dan memperhitungkan modul yang dimiliki definisi objek atau bersarang. Bekerja di Swift 4.x.
sumber
Untuk mendapatkan jenis objek atau kelas objek di Swift , Anda harus menggunakan jenis (dari: objek Anda)
jenis (dari: objek Anda)
sumber
Tidak persis apa yang Anda cari, tetapi Anda juga dapat memeriksa jenis variabel terhadap jenis Swift seperti:
Sebagai contoh.
sumber
Xcode 7.3.1, Swift 2.2:
String(instanceToPrint.self).componentsSeparatedByString(".").last
sumber