Cuando se trata de entender un programa, o en algunos casos, es útil poder saber de qué tipo es algo. Sé que el depurador puede mostrarle cierta información de tipo, y generalmente puede confiar en la inferencia de tipo para salirse sin especificar el tipo en esas situaciones, pero aún así, realmente me gustaría tener algo como Pythontype()
dynamicType (ver esta pregunta )
Actualización: esto se ha cambiado en una versión reciente de Swift, obj.dynamicType
ahora le da una referencia al tipo y no a la instancia del tipo dinámico.
Este parece el más prometedor, pero hasta ahora no he podido averiguar el tipo real
class MyClass {
var count = 0
}
let mc = MyClass()
# update: this now evaluates as true
mc.dynamicType === MyClass.self
También probé usando una referencia de clase para crear instancias de un objeto nuevo, lo que hace el trabajo, pero curiosamente me dio un error diciendo que debo añadir un required
inicializador:
trabajos:
class MyClass {
var count = 0
required init() {
}
}
let myClass2 = MyClass.self
let mc2 = MyClass2()
Sin embargo, solo un pequeño paso para descubrir realmente el tipo de cualquier objeto dado
editar : eliminé una cantidad considerable de detalles irrelevantes; mira el historial de edición si estás interesado :)
fuente
print(mc)
odump(mc)
imprimirá un resumen (que puede obtener detoString(mc)
oreflect(mc).summary
), que contendrá el nombre de la clase en alguna parte. Pero no está claro cómo obtener el nombre de la clase usted mismo.Respuestas:
Versión Swift 3:
fuente
var myVar: SomeType!
. El compilador da el error "No se puede convertir el valor del tipo 'SomeType! .Type' (también conocido como 'ImplicitlyUnwrappedOptional <SomeType> .Type') al tipo de argumento esperado 'AnyClass' (también conocido como 'AnyObject.Type') El compilador sugiere agregaras! AnyClass
después del tipo, pero luego programa se bloquea con un poco de "EXC_BAD_INSTRUCTION" y otro jiberrish que no puedo descifrar.String
que se pasa como tipo,Any
setype(of:)
generaráAny
, noString
.Swift 2.0:
La forma correcta de hacer este tipo de introspección de tipo sería con la estructura Mirror ,
Luego, para acceder al tipo en sí desde la
Mirror
estructura, usaría la propiedad de la siguientesubjectType
manera:Luego puede usar algo como esto:
fuente
String
yOptional(String)
no son lo mismoEl
dynamicType.printClassName
código es de un ejemplo en el libro Swift. No sé de ninguna manera para tomar directamente un nombre de clase personalizado, pero puede verificar un tipo de instancias usando lais
palabra clave como se muestra a continuación. Este ejemplo también muestra cómo implementar una función className personalizada, si realmente desea el nombre de la clase como una cadena.Nota: las
subclases de
NSObject
ya implementan su propia función className. Si está trabajando con Cocoa, puede usar esta propiedad.fuente
subjectType
ya no está disponible ydynamicType
provoca un mensaje de desaprobación del compilador.A partir de Xcode 6.0.1 (al menos, no estoy seguro de cuándo lo agregaron), su ejemplo original ahora funciona:
Actualizar:
Para responder a la pregunta original, puede utilizar el tiempo de ejecución de Objective-C con objetos Swift simples con éxito.
Intenta lo siguiente:
fuente
Si simplemente necesita verificar si la variable es de tipo X, o si se ajusta a algún protocolo, puede usarla
is
, oas?
como se indica a continuación:Esto es equivalente a
isKindOfClass
en Obj-C.Y esto es equivalente a
conformsToProtocol
, oisMemberOfClass
fuente
as?
lanzamiento condicional también hace lo mismoisKindOfClass
, solo proporciona el resultado del lanzamiento si tiene éxito.isMemberOfClass
es la condiciónobject.dynamicType == ClassName.self
.Swift 3:
fuente
is
existe antes de Swift 3 ...?Para Swift 3.0
Para Swift 2.0 - 2.3
fuente
Aquí hay 2 formas en que recomiendo hacerlo:
O:
Aquí hay un ejemplo detallado:
fuente
print( aShape is Square )
, elis
operador es más preferible.Depende del caso de uso. Pero supongamos que desea hacer algo útil con sus tipos "variables". La
switch
declaración Swift es muy poderosa y puede ayudarlo a obtener los resultados que está buscando ...En este caso, tenga un diccionario simple que contenga pares clave / valor que pueden ser UInt, Int o String. En el
.filter()
método en el diccionario, necesito asegurarme de probar los valores correctamente y solo probar una Cadena cuando es una cadena, etc. ¡La instrucción switch hace que esto sea simple y seguro! Al asignar 9 a la variable de tipo Any, se ejecuta el cambio para Int. Intenta cambiarlo a:... e inténtalo de nuevo. Esta vez se ejecuta el
as String
caso.fuente
Si recibe una advertencia de "siempre verdadero / falla", es posible que deba enviar a Any antes de usar
is
fuente
fuente