Mendapatkan nama kelas suatu objek String
menggunakan:
object_getClassName(myViewController)
mengembalikan sesuatu seperti ini:
_TtC5AppName22CalendarViewController
Saya mencari murni versi: "CalendarViewController"
. Bagaimana cara mendapatkan string yang dibersihkan dari nama kelas saja?
Saya menemukan beberapa upaya pertanyaan tentang ini tetapi bukan jawaban yang sebenarnya. Apakah itu tidak mungkin sama sekali?
Jawaban:
String dari sebuah instance :
String dari suatu jenis :
Contoh:
Diuji dengan
class
,struct
danenum
.sumber
String(describing: MyViewController.self)
seperti yang disebutkan dalam beberapa jawaban di bawah.Foo
untukFoo2
tetapi membuat kelasFoo
lain, bahwa kekuatan rem kode). Dalam hal subklas Anda perlu menggunakan salah satutype(of:)
atauType.self
tergantung apa yang sesuai dengan kebutuhan Anda. Mungkintype(of:)
lebih tepat untuk mendapatkan nama kelas.DIPERBARUI UNTUK SWIFT 5
Kita bisa mendapatkan deskripsi yang cukup tentang nama tipe menggunakan variabel instance melalui
String
initializer dan membuat objek baru dari kelas tertentuSeperti, misalnya
print(String(describing: type(of: object)))
. Di manaobject
bisa menjadi variabel instan seperti array, kamus, anInt
, aNSDate
, dll.Karena
NSObject
adalah kelas dasar dari sebagian besar hierarki kelas Objective-C, Anda dapat mencoba membuat ekstensi untukNSObject
mendapatkan nama kelas dari setiap subclass dariNSObject
. Seperti ini:Atau Anda bisa membuat funcion statis yang parameternya bertipe
Any
(Protokol yang semua jenisnya sesuai) dan mengembalikan nama kelas sebagai String. Seperti ini:Sekarang Anda dapat melakukan sesuatu seperti ini:
Juga, begitu kita bisa mendapatkan nama kelas sebagai String, kita dapat membuat instance objek baru dari kelas itu :
Mungkin ini membantu seseorang di luar sana!
sumber
classNameAsString
dapat disederhanakan untukclassName
, untuk "nama" tersirat tipenya.theClassName
mirip dengan kisah facebook, yang awalnya bernama facebook.ProjectTest.MyViewController
. Bagaimana cara saya menyingkirkan nama proyek ini? Saya hanya ingin nama kelas.Cepat 5
Berikut ini ekstensi untuk mendapatkan
typeName
sebagai variabel (berfungsi dengan tipe nilai atau tipe referensi).Cara Penggunaan:
sumber
Swift 3.0
String(describing: MyViewController.self)
sumber
type(of: )
ada banyak pembunuhan di sana,String(describing: MyViewController.self)
akan cukupString.init(describing: MyViewController.self)
?init
itu tidak perlu.Saya menyarankan pendekatan seperti itu ( sangat cepat ):
Itu tidak menggunakan introspeksi atau demangling manual ( tidak ada sihir! ).
Ini demo:
sumber
type(of: self)
Jika Anda mengetik
Foo
, kode berikut akan memberi Anda"Foo"
Swift 3 dan Swift 4:Masalah dengan sebagian besar jawaban di sini adalah bahwa mereka memberi Anda
"Foo.Type"
sebagai string yang dihasilkan ketika Anda tidak memiliki contoh jenis apa pun, ketika apa yang Anda inginkan sebenarnya adil"Foo"
. Berikut ini memberi Anda"Foo.Type"
, sebagaimana disebutkan dalam banyak jawaban lainnya.Bagian
type(of:)
itu tidak perlu jika Anda hanya ingin"Foo"
.sumber
Di Swift 4.1 dan sekarang Swift 4.2 :
Jika Anda tidak memiliki instance sekitar:
Jika Anda memiliki instance sekitar:
sumber
Untuk mendapatkan nama kelas Swift dari objek, misalnya untuk objek var: SomeClass (), gunakan
Untuk mendapatkan nama kelas Swift dari tipe kelas, misalnya SomeClass, gunakan:
Keluaran:
sumber
Anda dapat mencoba cara ini:
sumber
Anda dapat menggunakan fungsi pustaka standar Swift yang disebut
_stdlib_getDemangledTypeName
seperti ini:sumber
Untuk mendapatkan nama jenis sebagai string di Swift 4 (saya belum memeriksa versi sebelumnya), cukup gunakan interpolasi string:
Anda bisa menggunakan
.self
tipe itu sendiri, dantype(of:_)
fungsinya pada instance:sumber
Anda juga dapat menggunakan mirror:
NB: Metode ini juga dapat digunakan untuk Structs dan Enums. Ada displayStyle yang memberikan indikasi jenis struktur apa:
Pengembalian adalah enum sehingga Anda dapat:
sumber
Cepat 5.1
Anda bisa mendapatkan nama kelas, struct, enum, protokol dan NSObject
Self.self
.sumber
String(describing: type(of: self))
)Swift 3.0: Anda dapat membuat ekstensi seperti ini .. Ini mengembalikan nama kelas tanpa nama proyek
sumber
Anda dapat memperluas
NSObjectProtocol
di Swift 4 seperti ini:Ini akan membuat variabel terhitung
className
tersedia untuk SEMUA kelas. Menggunakan ini diprint()
dalamCalendarViewController
akan mencetak"CalendarViewController"
di konsol.sumber
Saya sudah mencari jawaban ini berulang-ulang. Saya menggunakan GKStateMachine dan suka mengamati perubahan status dan ingin cara mudah untuk melihat hanya nama kelasnya. Saya tidak yakin apakah itu hanya iOS 10 atau Swift 2.3, tetapi di lingkungan itu, berikut ini melakukan persis apa yang saya inginkan:
sumber
Anda bisa mendapatkan nama kelas melakukan sesuatu seperti:
sumber
Untuk mendapatkan nama kelas sebagai String mendeklarasikan kelas Anda sebagai berikut
Dan dapatkan nama kelas menggunakan sintaks berikut
sumber
Coba
reflect().summary
di Kelas mandiri atau contoh dinamis. Buka bungkusan opsional sebelum mendapatkan dynamicType, jika tidak, dynamicType adalah pembungkus opsional.Ringkasan adalah jalur kelas dengan tipe generik yang dijelaskan. Untuk mendapatkan nama kelas yang sederhana dari ringkasan, cobalah metode ini.
sumber
Solusi di atas tidak berhasil untuk saya. Sebagian besar masalah yang dihasilkan disebutkan dalam beberapa komentar:
atau
Solusi ini bekerja pada XCode 9, Swift 3.0:
Saya menamainya
classNameCleaned
sehingga lebih mudah diakses dan tidak bertentangan denganclassName()
perubahan di masa depan :}
Pemakaian:
sumber
Swift 3.0 (macOS 10.10 dan yang lebih baru), Anda bisa mendapatkannya dari className
sumber
NSObject
developer.apple.com/reference/objectivec/nsobject/…Saya mencoba
type(of:...)
di Playground dengan Swift 3. Ini adalah hasil saya. Ini adalah versi format kode.sumber
Cepat 5
sumber
Contoh semacam ini untuk kelas var. Jangan sertakan nama bundel.
sumber
Jika Anda tidak menyukai nama yang rusak, Anda dapat menentukan nama Anda sendiri:
Namun, dalam jangka panjang akan lebih baik untuk belajar mengurai nama yang rusak. Formatnya standar dan bermakna dan tidak akan berubah.
sumber
Terkadang solusi lain akan memberikan nama yang tidak berguna tergantung pada objek apa yang Anda coba lihat. Dalam hal ini Anda bisa mendapatkan nama kelas sebagai string menggunakan yang berikut ini.
⌘ klik fungsi dalam xcode untuk melihat beberapa metode terkait yang cukup berguna. atau periksa di sini https://developer.apple.com/reference/objectivec/objective_c_functions
sumber
Swift 5 Anda bisa mendapatkan class_name sebagai string dengan String (menggambarkan: Self.self)
sumber
Saya menggunakannya di Swift 2.2
sumber
Swift 5.1: -
Anda juga dapat menggunakan fungsi generik untuk mendapatkan nama kelas objek sebagai string
Panggil fungsi ini dengan menggunakan berikut: -
Selamat Coding :)
sumber
Swift 5.2:
sumber