Uzyskiwanie nazwy klasy obiektu za String
pomocą:
object_getClassName(myViewController)
zwraca coś takiego:
_TtC5AppName22CalendarViewController
Szukam do czystej wersji: "CalendarViewController"
. Jak mogę posprzątać zamiast ciąg nazwy klasy?
Znalazłem kilka prób zadawania pytań na ten temat, ale nie rzeczywistą odpowiedź. Czy to w ogóle nie jest możliwe?
Odpowiedzi:
Ciąg z instancji :
Ciąg z typu :
Przykład:
Testowane z
class
,struct
ienum
.źródło
String(describing: MyViewController.self)
jak zaznaczono w kilku odpowiedziach poniżej.Foo
doFoo2
jednak utworzyć klasęFoo
gdzie indziej, że hamulcowy może kod). W przypadku podklasy należy użyć jednejtype(of:)
lub wType.self
zależności od potrzeb. Prawdopodobnietype(of:)
jest bardziej odpowiedni do uzyskania nazwy klasy.AKTUALIZACJA DO SWIFT 5
Możemy uzyskać ładne opisy nazw typów za pomocą zmiennej instancji poprzez
String
inicjator i stworzyć nowe obiekty określonej klasyNa przykład
print(String(describing: type(of: object)))
. W przypadku, gdyobject
może być przykład zmienne jak tablicy, słownika, co oznaczaInt
, ANSDate
, itd.Ponieważ
NSObject
jest to klasa główna większości hierarchii klas Objective-C, możesz spróbować utworzyć rozszerzenie dlaNSObject
uzyskania nazwy klasy każdej podklasyNSObject
. Lubię to:Możesz też utworzyć funkcję statyczną, której parametr jest typu
Any
(protokół, z którym domyślnie wszystkie typy się zgadzają) i zwraca nazwę klasy jako String. Lubię to:Teraz możesz zrobić coś takiego:
Ponadto, gdy będziemy mogli uzyskać nazwę klasy jako String, możemy utworzyć instancję nowych obiektów tej klasy :
Może to pomaga komuś tam!
źródło
classNameAsString
można uprościćclassName
, ponieważ „nazwa” implikuje jej typ.theClassName
jest podobna do historii na Facebooku, która pierwotnie nosi nazwę thefacebook.ProjectTest.MyViewController
. Jak pozbyć się nazwy tego projektu? Chcę tylko nazwę klasy.Szybki 5
Oto rozszerzenie, które można uzyskać
typeName
jako zmienną (praca zarówno z typem wartości, jak i typem odniesienia).Jak używać:
źródło
Swift 3.0
String(describing: MyViewController.self)
źródło
type(of: )
jest tam przesada,String(describing: MyViewController.self)
wystarczyString.init(describing: MyViewController.self)
?init
jest to konieczne.Proponuję takie podejście ( bardzo Swifty ):
Nie używa introspekcji ani ręcznego demontażu ( bez magii! ).
Oto demo:
źródło
type(of: self)
Jeśli wpiszesz
Foo
,"Foo"
w Swift 3 i Swift 4 otrzymasz następujący kod :Problem z większością odpowiedzi tutaj jest taki, że podają one
"Foo.Type"
jako wynikowy ciąg, gdy nie masz żadnej instancji tego typu, gdy to, czego naprawdę chcesz, jest po prostu"Foo"
. Poniżej podano"Foo.Type"
, jak wspomniano w kilku innych odpowiedziach.Ta
type(of:)
część jest niepotrzebna, jeśli chcesz"Foo"
.źródło
W Swift 4.1, a teraz Swift 4.2 :
Jeśli nie masz instancji w pobliżu:
Jeśli masz instancję w pobliżu:
źródło
Aby uzyskać nazwę klasy Swift z obiektu, np. Dla var object: SomeClass (), użyj
Aby uzyskać nazwę klasy Swift z typu klasy, np. SomeClass, użyj:
Wynik:
źródło
Możesz spróbować w ten sposób:
źródło
Możesz użyć standardowej funkcji biblioteki Swift o nazwie
_stdlib_getDemangledTypeName
:źródło
Aby uzyskać nazwę typu jako ciąg w Swift 4 (nie sprawdzałem wcześniejszych wersji), po prostu użyj interpolacji ciągów:
Możesz użyć
.self
na samym typie, atype(of:_)
funkcję na instancji:źródło
Można również użyć serwerów lustrzanych:
Uwaga: Ta metoda może być również stosowana do Struktur i Wyliczeń. Istnieje displayStyle, który wskazuje, jaki typ struktury:
Zwrot jest wyliczeniem, dzięki czemu możesz:
źródło
Swift 5.1
Możesz jednak uzyskać nazwy klas, struct, enum, protokół i NSObject
Self.self
.źródło
String(describing: type(of: self))
)Swift 3.0: Możesz utworzyć rozszerzenie takie jak to. Zwraca nazwę klasy bez nazwy projektu
źródło
Możesz rozszerzyć
NSObjectProtocol
Swift 4 w następujący sposób:Dzięki temu zmienna obliczona będzie
className
dostępna dla WSZYSTKICH klas. Użycie tego wprint()
inCalendarViewController
spowoduje wydrukowanie"CalendarViewController"
w konsoli.źródło
Od jakiegoś czasu szukam tej odpowiedzi. Używam GKStateMachine i lubię obserwować zmiany stanu i chciałem w łatwy sposób zobaczyć tylko nazwę klasy. Nie jestem pewien, czy to tylko iOS 10 czy Swift 2.3, ale w tym środowisku następujące czynności są dokładnie takie, jak chcę:
źródło
Możesz uzyskać nazwę klasy robiąc coś takiego:
źródło
Aby uzyskać nazwę klasy jako String, zadeklaruj swoją klasę w następujący sposób
I uzyskaj nazwę klasy, używając następującej składni
źródło
Spróbuj
reflect().summary
na Class self lub instance dynamicType. Rozpakuj opcje przed uzyskaniem dynamicType, w przeciwnym razie dynamicType jest Opcjonalnym opakowaniem.Podsumowanie jest ścieżką klasy z opisanymi typami rodzajowymi. Aby uzyskać prostą nazwę klasy z podsumowania, wypróbuj tę metodę.
źródło
Powyższe rozwiązania nie działały dla mnie. Wytworzone głównie problemy wymieniane w kilku komentarzach:
lub
Te rozwiązania działały na XCode 9, Swift 3.0:
Nazwałem go,
classNameCleaned
aby był łatwiejszy w dostępie i nie powodował konfliktu z przyszłymiclassName()
zmianami:}
Stosowanie:
źródło
Swift 3.0 (macOS 10.10 i nowsze wersje) można pobrać z className
źródło
NSObject
developer.apple.com/reference/objectivec/nsobject/…Próbowałem
type(of:...)
na Playground z Swift 3. To jest mój wynik. To jest wersja formatu kodu.źródło
Szybki 5
źródło
Ten rodzaj przykładu dla var var. Nie podawaj nazwy pakietu.
źródło
Jeśli nie podoba Ci się zniekształcone imię, możesz podyktować swoje imię:
Jednak na dłuższą metę lepiej byłoby nauczyć się analizować zniekształconą nazwę. Format jest standardowy i znaczący i nie ulega zmianie.
źródło
Czasami inne rozwiązania podają nieprzydatną nazwę w zależności od obiektu, na który próbujesz spojrzeć. W takim przypadku możesz uzyskać nazwę klasy jako ciąg znaków, używając następującego.
⌘ kliknij funkcję w xcode, aby zobaczyć niektóre pokrewne metody, które są dość przydatne. lub sprawdź tutaj https://developer.apple.com/reference/objectivec/objective_c_functions
źródło
Swift 5 Możesz uzyskać nazwę_klasy jako ciąg znaków za pomocą ciągu znaków (opisującego: Self.self)
źródło
Używam go w Swift 2.2
źródło
Swift 5.1: -
Możesz także użyć funkcji ogólnej, aby uzyskać nazwę klasy obiektu jako ciąg znaków
Wywołaj tę funkcję, wykonując następujące czynności:
Happy Coding :)
źródło
Swift 5.2:
źródło