¿Hay alguna manera de imprimir el tipo de tiempo de ejecución de una variable en swift? Por ejemplo:
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
En el ejemplo anterior, estoy buscando una manera de mostrar que la variable "pronto" es de tipo ImplicitlyUnwrappedOptional<NSDate>
, o al menos NSDate!
.
Respuestas:
Actualización de septiembre de 2016
Swift 3.0: uso
type(of:)
, p. Ej.type(of: someThing)
(Ya quedynamicType
se eliminó la palabra clave)Actualización de octubre de 2015 :
Actualicé los ejemplos a continuación a la nueva sintaxis de Swift 2.0 (por ejemplo,
println
se reemplazó porprint
,toString()
ahora esString()
).De las notas de la versión Xcode 6.3 :
@nschum señala en los comentarios que las notas de lanzamiento de Xcode 6.3 muestran otra forma:
Qué salidas:
Actualización para Xcode 6.3:
Puedes usar el
_stdlib_getDemangledTypeName()
:y obtener esto como salida:
Respuesta original:
Antes de Xcode 6.3
_stdlib_getTypeName
obtuvo el nombre de tipo destrozado de una variable. La entrada del blog de Ewan Swick ayuda a descifrar estas cadenas:Por ejemplo,
_TtSi
significa elInt
tipo interno de Swift .Mike Ash tiene una gran entrada de blog que cubre el mismo tema .
fuente
_stdlib_getTypeName()
? El REPL integrado ya no existe,swift-ide-test
tampoco existe, y la impresión de Xcode del módulo Swift_
elimina los valores prefijados.lldb
bastante facilidad en la respuesta. También hay_stdlib_getDemangledTypeName()
, y_stdlib_demangleName()
.image
era un atajotarget modules
. Terminé usandotarget modules lookup -r -n _stdlib_
, que por supuesto se expresa mejor comoimage lookup -r -n _stdlib_ libswiftCore.dylib
dynamicType
palabra clave se ha eliminado de Swift. En su lugar,type(of:)
se ha agregado una nueva función primitiva al lenguaje: github.com/apple/swift/blob/master/CHANGELOG.mdEditar: se ha introducido una nueva
toString
función en Swift 1.2 (Xcode 6.3) .Ahora puede imprimir el tipo solicitado de cualquier tipo usando
.self
y cualquier instancia usando.dynamicType
:Intenta llamar
YourClass.self
yyourObject.dynamicType
.Referencia: https://devforums.apple.com/thread/227425 .
fuente
someInstance.dynamicType.printClassName()
imprimirá el nombre de la clase.Swift 3.0
fuente
¿Es esto lo que estás buscando?
Imprime "__NSDate"
ACTUALIZACIÓN : Tenga en cuenta que esto ya no parece funcionar a partir de Beta05
fuente
Mi Xcode actual es la versión 6.0 (6A280e).
Salida:
fuente
Optional(...)
, por lo que su código solo volveríaOptional
como el Tipo. ¡También debería aparecervar optionalTestVar: Person? = Person(name:"Sarah")
como Opcional (Persona) y var con Persona! as ImplícitamenteUnwrappedOptional (Person)A partir de Xcode 6.3 con Swift 1.2, simplemente puede convertir los valores de tipo al valor total requerido
String
.fuente
Todavía puede acceder a la clase, a través de
className
(que devuelve aString
).En realidad, hay varias maneras de obtener la clase, por ejemplo
classForArchiver
,classForCoder
,classForKeyedArchiver
(todos de retornoAnyClass!
).No se puede obtener el tipo de primitivo (un primitivo no es una clase).
Ejemplo:
Si desea obtener el tipo de primitivo, debe usarlo
bridgeToObjectiveC()
. Ejemplo:fuente
import Cocoa
.className
es parte del soporte AppleScript de Cocoa y definitivamente no debe usarse para introspección genérica. Obviamente no está disponible en iOS.Puede usar reflect para obtener información sobre el objeto.
Por ejemplo, nombre de la clase de objeto:
fuente
reflect(x).summary
- ¡gracias!Tuve suerte con:
fuente
Tipo de uso de Xcode 8 Swift 3.0 (de :)
fuente
En Xcode 8, Swift 3.0
Pasos:
1. Obtenga el tipo:
Opción 1:
Opcion 2:
2. Convertir tipo a cadena:
fuente
En Swift 3.0, puede usar
type(of:)
, ya que ladynamicType
palabra clave se ha eliminado.fuente
SWIFT 5
Con la última versión de Swift 3 podemos obtener descripciones bonitas de los nombres de tipo a través del
String
inicializador. Me gusta, por ejemploprint(String(describing: type(of: object)))
. ¿Dóndeobject
puede haber una variable de instancia como matriz, un diccionario, unaInt
, unaNSDate
, una instancia de una clase personalizada, etc.Aquí está mi respuesta completa: obtener el nombre de clase del objeto como cadena en Swift
Esa pregunta está buscando una forma de obtener el nombre de clase de un objeto como una cadena, pero también propuse otra forma de obtener el nombre de clase de una variable que no es una subclase de
NSObject
. Aquí está:Hice una función estática que toma como parámetro un objeto de tipo
Any
y devuelve su nombre de clase comoString
:).Probé esta función con algunas variables como:
y la salida fue:
fuente
Al usar Cocoa (no CocoaTouch), puede usar la
className
propiedad para objetos que son subclases de NSObject.Esta propiedad no está disponible para objetos Swift normales, que no son subclases de NSObject (y de hecho, no hay identificación de raíz o tipo de objeto en Swift).
En CocoaTouch, en este momento no hay una manera de obtener una descripción de cadena del tipo de una variable dada. Funcionalidad similar tampoco existe para los tipos primitivos en Cocoa o CocoaTouch.
Swift REPL puede imprimir un resumen de valores, incluido su tipo, por lo que es posible que esta forma de introspección sea posible a través de una API en el futuro.
EDITAR :
dump(object)
parece hacer el truco.fuente
dump(object)
es realmente poderoso. Gracias.La respuesta principal no tiene un ejemplo funcional de la nueva forma de hacer esto usando
type(of:
. Entonces, para ayudar a los novatos como yo, aquí hay un ejemplo de trabajo, tomado principalmente de los documentos de Apple aquí: https://developer.apple.com/documentation/swift/2885064-typefuente
He intentado algunas de las otras respuestas aquí, pero parece que Milage sabe muy bien cuál es el objeto subyacente.
Sin embargo, encontré una forma de obtener el nombre de la clase Object-C para un objeto haciendo lo siguiente:
Aquí hay un ejemplo de cómo lo usarías:
En este caso, imprimirá NSDate en la consola.
fuente
Encontré esta solución que, con suerte, podría funcionar para otra persona. Creé un método de clase para acceder al valor. Tenga en cuenta que esto funcionará solo para la subclase NSObject. Pero al menos es una solución limpia y ordenada.
fuente
En el último XCode 6.3 con Swift 1.2, esta es la única forma en que encontré:
fuente
<swift module name>.<actual class name>
, por lo que desea dividir la cadena con a.
y obtener el último token.Muchas de las respuestas aquí no funcionan con el último Swift (Xcode 7.1.1 al momento de escribir).
La forma actual de obtener la información es crear un
Mirror
e interrogarlo. Para el nombre de clase es tan simple como:También se puede recuperar información adicional sobre el objeto de
Mirror
. Ver http://swiftdoc.org/v2.1/type/Mirror/ para más detalles.fuente
En lldb a partir de beta 5, puede ver la clase de un objeto con el comando:
que produce algo como:
El comando expandido significa algo como:
Frame Variable
(imprimir una variable de cuadro)-d run_target
(expandir tipos dinámicos)Algo útil para saber es que el uso de "Frame Variable" para generar valores de variables garantiza que no se ejecute ningún código.
fuente
He encontrado una solución para las clases de desarrollo propio (o a las que tiene acceso).
Coloque la siguiente propiedad calculada dentro de su definición de clase de objetos:
Ahora puede simplemente llamar el nombre de la clase en su objeto de la siguiente manera:
Tenga en cuenta que esto solo funcionará si su definición de clase se realiza dentro de un archivo que se llama exactamente como la clase de la que desea el nombre.
Como este es comúnmente el caso, la respuesta anterior debería hacerlo para la mayoría de los casos . Pero en algunos casos especiales, es posible que deba encontrar una solución diferente.
Si necesita el nombre de la clase dentro de la clase (archivo), simplemente puede usar esta línea:
Quizás este método ayude a algunas personas.
fuente
Basado en las respuestas y comentarios dados por Klass y Kevin Ballard arriba, iría con:
que imprimirá:
fuente
toString(self.dynamicType).componentsSeparatedByString(".").last!
obviamente, estaba en un contexto de objeto y podía hacer referenciaself
.fuente
Swift versión 4:
Gracias @Joshua Dance
fuente
Swift 4:
Uso:
fuente
Parece que no hay una forma genérica de imprimir el nombre del tipo de un valor arbitrario. Como otros han señalado, para las instancias de clase puede imprimir
value.className
pero para valores primitivos parece que en tiempo de ejecución, la información de tipo se ha ido.Por ejemplo, parece que no hay una forma de escribir:
1.something()
y salirInt
por cualquier valor desomething
. (Puede, como se sugirió otra respuesta, el usoi.bridgeToObjectiveC().className
a dar una pista, pero__NSCFNumber
es no realmente el tipo dei
-. Sólo lo que se convertirá en cuando se cruza el límite de una llamada a la función de Objective-C)Me encantaría que me demuestren que estoy equivocado, pero parece que la verificación de tipos se realiza en tiempo de compilación, y como C ++ (con RTTI deshabilitado), gran parte de la información de tipos desaparece en tiempo de ejecución.
fuente
Así es como se obtiene una cadena de tipo de su objeto o Tipo que es coherente y tiene en cuenta a qué módulo pertenece o está anidada la definición del objeto. Funciona en Swift 4.x.
fuente
Para obtener un tipo de objeto o clase de objeto en Swift , debe usar un tipo (de: yourObject)
tipo (de: suObjeto)
fuente
No es exactamente lo que busca, pero también puede verificar el tipo de la variable con los tipos Swift de la siguiente manera:
Por ejemplo.
fuente
Xcode 7.3.1, Swift 2.2:
String(instanceToPrint.self).componentsSeparatedByString(".").last
fuente