Obtener el nombre de clase de un objeto como String
usando:
object_getClassName(myViewController)
devuelve algo como esto:
_TtC5AppName22CalendarViewController
Busco a la pura versión: "CalendarViewController"
. ¿Cómo obtengo una cadena limpia del nombre de la clase en su lugar?
Encontré algunos intentos de preguntas sobre esto, pero no una respuesta real. ¿No es posible en absoluto?
Respuestas:
Cadena de una instancia :
Cadena de un tipo :
Ejemplo:
Probado con
class
,struct
yenum
.fuente
String(describing: MyViewController.self)
como se indica en algunas respuestas a continuación.Foo
aFoo2
, pero crear una claseFoo
a otra parte, que la fuerza de frenado del código). En caso de subclases, debe usar cualquieratype(of:)
oType.self
según lo que se adapte a sus necesidades. Probablementetype(of:)
sea más apropiado para obtener el nombre de la clase.ACTUALIZADO A SWIFT 5
Podemos obtener descripciones bonitas de nombres de tipos usando la variable de instancia a través del
String
inicializador y crear nuevos objetos de una clase determinadaMe gusta, por ejemplo
print(String(describing: type(of: object)))
. Dondeobject
puede haber una variable de instancia como array, un diccionario, anInt
, aNSDate
, etc.Debido a que
NSObject
es la clase raíz de la mayoría de las jerarquías de clase Objective-C, podría intentar hacer una extensión paraNSObject
obtener el nombre de clase de cada subclase deNSObject
. Me gusta esto:O podría hacer una función estática cuyo parámetro sea de tipo
Any
(El protocolo al que todos los tipos se ajustan implícitamente) y devuelva el nombre de la clase como Cadena. Me gusta esto:Ahora puedes hacer algo como esto:
Además, una vez que podamos obtener el nombre de la clase como String, podemos crear instancias de nuevos objetos de esa clase :
¡Quizás esto ayude a alguien!
fuente
classNameAsString
se puede simplificar aclassName
, porque ese "nombre" implica su tipo.theClassName
es similar a la historia de Facebook, que originalmente se llama thefacebook.ProjectTest.MyViewController
. ¿Cómo me deshago de este nombre de proyecto? Solo quiero el nombre de la clase.Swift 5
Aquí está la extensión para obtener el
typeName
como una variable (trabajar tanto con el tipo de valor como con el tipo de referencia).Cómo utilizar:
fuente
Swift 3.0
String(describing: MyViewController.self)
fuente
type(of: )
es una exageración allí,String(describing: MyViewController.self)
será suficienteString.init(describing: MyViewController.self)
?init
es necesario.Sugiero tal enfoque ( muy Swifty ):
No utiliza ni introspección ni demanda manual (¡ sin magia! ).
Aquí hay una demostración:
fuente
type(of: self)
Si tiene tipo
Foo
, el siguiente código le dará"Foo"
en Swift 3 y Swift 4:El problema con la mayoría de las respuestas aquí es que te dan
"Foo.Type"
como la cadena resultante cuando no tienes ninguna instancia del tipo, cuando lo que realmente quieres es justo"Foo"
. Lo siguiente le da"Foo.Type"
, como se menciona en un montón de las otras respuestas.La
type(of:)
parte es innecesaria si solo quieres"Foo"
.fuente
En Swift 4.1 y ahora Swift 4.2 :
Si no tiene una instancia alrededor:
Si tiene una instancia alrededor:
fuente
Para obtener el nombre de una clase Swift de un objeto, por ejemplo, para un objeto var: SomeClass (), use
Para obtener el nombre de una clase Swift de un tipo de clase, por ejemplo, SomeClass, use:
Salida:
fuente
Puedes probar de esta manera:
fuente
Puede usar la función de biblioteca estándar Swift llamada
_stdlib_getDemangledTypeName
así:fuente
Para obtener el nombre del tipo como una cadena en Swift 4 (no he verificado las versiones anteriores), solo use la interpolación de cadenas:
Puede usar
.self
un tipo en sí mismo y latype(of:_)
función en una instancia:fuente
También se pueden usar espejos:
NB: este método también se puede utilizar para estructuras y enumeraciones. Hay un displayStyle que da una indicación de qué tipo de estructura:
El retorno es una enumeración para que pueda:
fuente
Swift 5.1
Sin embargo, puede obtener nombres de clase, estructura, enumeración, protocolo y NSObject
Self.self
.fuente
String(describing: type(of: self))
)Swift 3.0: puede crear una extensión como esta. Devuelve el nombre de la clase sin el nombre del proyecto
fuente
Puede ampliar
NSObjectProtocol
en Swift 4 de esta manera:Esto hará que la variable calculada
className
esté disponible para TODAS las clases. El uso de este dentro de unaprint()
enCalendarViewController
imprimirá"CalendarViewController"
en la consola.fuente
He estado buscando esta respuesta de vez en cuando. Uso GKStateMachine y me gusta observar los cambios de estado y quería una manera fácil de ver solo el nombre de la clase. No estoy seguro de si es solo iOS 10 o Swift 2.3, pero en ese entorno, lo siguiente hace exactamente lo que quiero:
fuente
Puede obtener el nombre de la clase haciendo algo como:
fuente
Para obtener el nombre de la clase como String, declare su clase de la siguiente manera
Y obtenga el nombre de la clase usando la siguiente sintaxis
fuente
Pruébelo
reflect().summary
en Clase propia o instancia tipo dinámico. Desenvuelva los opcionales antes de obtener dynamicType; de lo contrario, dynamicType es el contenedor opcional.El resumen es una ruta de clase con tipos genéricos descritos. Para obtener un nombre de clase simple del resumen, pruebe este método.
fuente
Las soluciones anteriores no funcionaron para mí. La mayoría de los problemas se mencionan en varios comentarios:
o
Estas soluciones funcionaron en XCode 9, Swift 3.0:
Lo nombré
classNameCleaned
para que sea más fácil acceder y no entre en conflicto con futurosclassName()
cambios:}
Uso:
fuente
Swift 3.0 (macOS 10.10 y posterior), puede obtenerlo de className
fuente
NSObject
developer.apple.com/reference/objectivec/nsobject/…Lo intenté
type(of:...)
en Playground con Swift 3. Este es mi resultado. Esta es la versión en formato de código.fuente
Swift 5
fuente
Este tipo de ejemplo para la clase var. No incluya el nombre del paquete.
fuente
Si no le gusta el nombre destrozado, puede dictar su propio nombre:
Sin embargo, a la larga sería mejor aprender a analizar el nombre destrozado. El formato es estándar y significativo y no cambiará.
fuente
A veces, las otras soluciones darán un nombre no útil según el objeto que intente mirar. En ese caso, puede obtener el nombre de la clase como una cadena utilizando lo siguiente.
Haga clic en la función en xcode para ver algunos métodos relacionados que son bastante útiles. o marque aquí https://developer.apple.com/reference/objectivec/objective_c_functions
fuente
Swift 5 Puede obtener class_name como una cadena con String (que describe: Self.self)
fuente
Lo uso en Swift 2.2
fuente
Swift 5.1: -
También puede usar la función genérica para obtener el nombre de clase del objeto como cadena
Llame a esta función usando lo siguiente: -
Happy Coding :)
fuente
Swift 5.2:
fuente