Czy istnieje sposób szybkiego wydrukowania typu środowiska wykonawczego zmiennej? Na przykład:
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
W powyższym przykładzie szukam sposobu, aby pokazać, że zmienna „wkrótce” jest typu ImplicitlyUnwrappedOptional<NSDate>
, a przynajmniej NSDate!
.
Odpowiedzi:
Aktualizacja z września 2016 r
Swift 3.0: Użyj
type(of:)
, np.type(of: someThing)
(PonieważdynamicType
słowo kluczowe zostało usunięte)Aktualizacja październik 2015 :
Zaktualizowałem poniższe przykłady do nowej składni Swift 2.0 (np.
println
Został zastąpionyprint
,toString()
jest terazString()
).Z informacji o wersji Xcode 6.3 :
@nschum wskazuje w komentarzach, że uwagi do wydania Xcode 6.3 pokazują inny sposób:
Które wyjścia:
Aktualizacja dla Xcode 6.3:
Możesz użyć
_stdlib_getDemangledTypeName()
:i uzyskaj to jako wynik:
Oryginalna odpowiedź:
Przed Xcode 6.3
_stdlib_getTypeName
dostał zniekształconą nazwę zmiennej. Wpis na blogu Ewana Swicka pomaga rozszyfrować te ciągi:np.
_TtSi
oznacza wewnętrznyInt
typ Swift .Mike Ash ma świetny wpis na blogu na ten sam temat .
źródło
_stdlib_getTypeName()
? Zintegrowana REPL już nie istnieje,swift-ide-test
też nie istnieje, a drukowanie Xcode modułu Swift_
zawiera wartości z prefiksem.lldb
łatwo wyszukiwać symbole w replice. Jest też_stdlib_getDemangledTypeName()
i_stdlib_demangleName()
.image
to skróttarget modules
. Skończyło się na użyciutarget modules lookup -r -n _stdlib_
, co oczywiście lepiej wyraża się jakoimage lookup -r -n _stdlib_ libswiftCore.dylib
dynamicType
kluczowe zostało usunięte z Swift. W jego miejsce dodano nową prymitywną funkcjętype(of:)
do języka: github.com/apple/swift/blob/master/CHANGELOG.mdEdycja: W Swift 1.2 wprowadzono nową
toString
funkcję (Xcode 6.3) .Możesz teraz wydrukować zdemontowany typ dowolnego typu za pomocą
.self
i dowolnej instancji za pomocą.dynamicType
:Spróbuj zadzwonić
YourClass.self
iyourObject.dynamicType
.Odniesienie: https://devforums.apple.com/thread/227425 .
źródło
someInstance.dynamicType.printClassName()
wypisze nazwę klasy.Swift 3.0
źródło
Czy tego szukasz?
Wyświetla „__NSDate”
AKTUALIZACJA : Uwaga: wydaje się, że nie działa już od wersji Beta05
źródło
Mój obecny Xcode to wersja 6.0 (6A280e).
Wynik:
źródło
Optional(...)
, więc kod będzie zwracany tylkoOptional
jako Typ. Powinien również być wyświetlanyvar optionalTestVar: Person? = Person(name:"Sarah")
jako Opcjonalny (Osoba) i zmieniać się w opcji Osoba! as ImplicitlyUnwrappedOptional (Person)Począwszy od Xcode 6.3 z Swift 1.2, możesz po prostu przekonwertować wartości typu na w pełni demontowane
String
.źródło
Nadal możesz uzyskać dostęp do klasy, poprzez
className
(która zwraca aString
).Jest kilka sposobów, aby uzyskać klasę, na przykład
classForArchiver
,classForCoder
,classForKeyedArchiver
(wszystkie powrotneAnyClass!
).Nie można uzyskać typu prymitywu (prymityw nie jest klasą).
Przykład:
Jeśli chcesz uzyskać typ prymitywu, musisz użyć
bridgeToObjectiveC()
. Przykład:źródło
import Cocoa
.className
jest częścią obsługi AppleScript przez Cocoa i zdecydowanie nie powinien być używany do ogólnej introspekcji. Oczywiście nie jest dostępny na iOS.Możesz użyć funkcji odbicia, aby uzyskać informacje o obiekcie.
Na przykład nazwa klasy obiektu:
źródło
reflect(x).summary
- dzięki!Miałem szczęście z:
źródło
Typ użycia Xcode 8 Swift 3.0 (of :)
źródło
W Xcode 8, Swift 3.0
Kroki:
1. Uzyskaj typ:
Opcja 1:
Opcja 2:
2. Konwertuj typ na ciąg:
źródło
W Swift 3.0 możesz używać
type(of:)
, ponieważdynamicType
słowo kluczowe zostało usunięte.źródło
SWIFT 5
W najnowszej wersji Swift 3 możemy uzyskać ładny opis nazw typów za pomocą
String
inicjatora. Na przykładprint(String(describing: type(of: object)))
. Gdzieobject
może być zmienna instancji, taka jak tablica, słownik, anInt
,NSDate
instancja klasy niestandardowej itp.Oto moja pełna odpowiedź: Uzyskaj nazwę klasy obiektu jako ciąg znaków w Swift
To pytanie szuka sposobu na uzyskanie nazwy klasy obiektu jako ciągu, ale zaproponowałem także inny sposób na uzyskanie nazwy klasy zmiennej, która nie jest podklasą
NSObject
. Oto on:Zrobiłem funkcję statyczną, która przyjmuje jako parametr obiekt typu
Any
i zwraca nazwę swojej klasy jakoString
:).Testowałem tę funkcję z niektórymi zmiennymi, takimi jak:
i wynik był:
źródło
Korzystając z Cocoa (nie CocoaTouch), możesz użyć
className
właściwości dla obiektów, które są podklasami NSObject.Ta właściwość nie jest dostępna dla normalnych obiektów Swift, które nie są podklasami NSObject (w rzeczywistości w Swift nie ma identyfikatora głównego ani typu obiektu).
W CocoaTouch w tej chwili nie ma sposobu, aby uzyskać opis ciągu typu danej zmiennej. Podobna funkcjonalność również nie istnieje dla prymitywnych typów w Cocoa lub CocoaTouch.
Swift REPL jest w stanie wydrukować podsumowanie wartości, w tym ich typ, więc możliwe jest, że ten sposób introspekcji będzie możliwy za pośrednictwem interfejsu API w przyszłości.
EDYCJA :
dump(object)
wydaje się załatwić sprawę.źródło
dump(object)
jest naprawdę potężny. Dziękuję Ci.Najlepsza odpowiedź nie ma działającego przykładu nowego sposobu na zrobienie tego za pomocą
type(of:
. Aby pomóc początkującym jak ja, oto działający przykład, zaczerpnięty głównie z dokumentów Apple tutaj - https://developer.apple.com/documentation/swift/2885064-typeźródło
Próbowałem tutaj kilku innych odpowiedzi, ale zdaje się, że milage bardzo zależy na tym, czym jest obiekt leżący u podstaw.
Jednak znalazłem sposób na uzyskanie nazwy klasy Object-C dla obiektu, wykonując następujące czynności:
Oto przykład tego, jak byś go używał:
W takim przypadku wydrukuje NSDate w konsoli.
źródło
Znalazłem to rozwiązanie, które, mam nadzieję, może zadziałać dla kogoś innego. Stworzyłem metodę klasy, aby uzyskać dostęp do wartości. Pamiętaj, że będzie to działać tylko dla podklasy NSObject. Ale przynajmniej jest to czyste i uporządkowane rozwiązanie.
źródło
W najnowszym XCode 6.3 z Swift 1.2 znalazłem jedyny sposób:
źródło
<swift module name>.<actual class name>
, więc chcesz podzielić ciąg za pomocą a.
i uzyskać ostatni token.Wiele odpowiedzi tutaj nie działa z najnowszym Swift (Xcode 7.1.1 w momencie pisania).
Obecnym sposobem uzyskania informacji jest utworzenie
Mirror
i przesłuchanie tego. W przypadku nazwy klasy jest to tak proste, jak:Dodatkowe informacje o obiekcie można również pobrać z
Mirror
. Szczegółowe informacje można znaleźć na stronie http://swiftdoc.org/v2.1/type/Mirror/ .źródło
W lldb od wersji beta 5 możesz zobaczyć klasę obiektu za pomocą polecenia:
który wyprowadza coś takiego:
Rozbudowane polecenie oznacza coś takiego:
Frame Variable
(wydrukuj zmienną ramki)-d run_target
(rozwiń typy dynamiczne)Warto wiedzieć, że użycie „Frame Variable” do wyprowadzania wartości zmiennych gwarantuje, że kod nie zostanie wykonany.
źródło
Znalazłem rozwiązanie dla samodzielnie opracowanych klas (lub takich, do których masz dostęp).
Umieść następującą właściwość obliczoną w definicji klasy obiektów:
Teraz możesz po prostu wywołać nazwę klasy na swoim obiekcie w następujący sposób:
Pamiętaj, że zadziała to tylko wtedy, gdy twoja definicja klasy zostanie utworzona w pliku o nazwie dokładnie takiej , jak klasa, której nazwa ma mieć nazwę.
Ponieważ często tak jest, powyższa odpowiedź powinna zrobić to w większości przypadków . Ale w niektórych szczególnych przypadkach może być konieczne znalezienie innego rozwiązania.
Jeśli potrzebujesz nazwy klasy w samej klasie (pliku) , możesz po prostu użyć tego wiersza:
Może ta metoda pomaga niektórym ludziom.
źródło
W oparciu o odpowiedzi i komentarze Klassa i Kevina Ballarda powyżej wybrałbym:
który wydrukuje:
źródło
toString(self.dynamicType).componentsSeparatedByString(".").last!
oczywiście byłem w kontekście obiektowym i mogłem się do niego odwoływaćself
.źródło
Szybka wersja 4:
Dzięki @Joshua Dance
źródło
Swift 4:
Stosowanie:
źródło
Wydaje się, że nie ma ogólnego sposobu na wydrukowanie nazwy typu dowolnego typu wartości. Jak zauważyli inni, dla instancji klas można drukować,
value.className
ale dla prymitywnych wartości wydaje się, że w czasie wykonywania informacje o typie znikają.Na przykład wygląda na to, że nie ma sposobu na wpisanie:
1.something()
i skorzystaj zInt
dowolnej wartościsomething
. (Można, jak inna odpowiedź zasugerował użyciei.bridgeToObjectiveC().className
dać podpowiedź, ale__NSCFNumber
to nie faktycznie typi
. - tylko to, co zostanie skonwertowana do kiedy przecina granicę wywołania funkcji Objective-C)Byłbym szczęśliwy, gdybym udowodnił, że się mylę, ale wygląda na to, że sprawdzanie typu odbywa się w czasie kompilacji i podobnie jak C ++ (z wyłączonym RTTI) większość informacji o typie jest usuwana w czasie wykonywania.
źródło
W ten sposób otrzymujesz ciąg znaków swojego obiektu lub typu, który jest spójny i uwzględnia moduł, do którego należy definicja obiektu lub do której jest zagnieżdżona. Działa w Swift 4.x.
źródło
Aby uzyskać typ obiektu lub klasę obiektu w Swift , musisz użyć typu (of: yourObject)
type (of: yourObject)
źródło
Nie do końca to, czego szukasz, ale możesz także sprawdzić typ zmiennej względem typów Swift, takich jak:
Na przykład.
źródło
Xcode 7.3.1, Swift 2.2:
String(instanceToPrint.self).componentsSeparatedByString(".").last
źródło