Obtener el nombre de clase de un objeto como Stringusando:
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,structyenum.fuente
String(describing: MyViewController.self)como se indica en algunas respuestas a continuación.FooaFoo2, pero crear una claseFooa otra parte, que la fuerza de frenado del código). En caso de subclases, debe usar cualquieratype(of:)oType.selfsegú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
Stringinicializador y crear nuevos objetos de una clase determinadaMe gusta, por ejemplo
print(String(describing: type(of: object))). Dondeobjectpuede haber una variable de instancia como array, un diccionario, anInt, aNSDate, etc.Debido a que
NSObjectes la clase raíz de la mayoría de las jerarquías de clase Objective-C, podría intentar hacer una extensión paraNSObjectobtener 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
classNameAsStringse puede simplificar aclassName, porque ese "nombre" implica su tipo.theClassNamees 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
typeNamecomo 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)?inites 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_getDemangledTypeNameasí: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
.selfun 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
NSObjectProtocolen Swift 4 de esta manera:Esto hará que la variable calculada
classNameesté disponible para TODAS las clases. El uso de este dentro de unaprint()enCalendarViewControllerimprimirá"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().summaryen 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é
classNameCleanedpara 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
NSObjectdeveloper.apple.com/reference/objectivec/nsobject/…Lo intenté
Esta es la versión en formato de código.
type(of:...)en Playground con Swift 3. Este es mi resultado.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