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.dynamicTypeahora 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 requiredinicializador:
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! AnyClassdespués del tipo, pero luego programa se bloquea con un poco de "EXC_BAD_INSTRUCTION" y otro jiberrish que no puedo descifrar.Stringque se pasa como tipo,Anysetype(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
Mirrorestructura, usaría la propiedad de la siguientesubjectTypemanera:Luego puede usar algo como esto:
fuente
StringyOptional(String)no son lo mismoEl
dynamicType.printClassNamecó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 laispalabra 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
NSObjectya implementan su propia función className. Si está trabajando con Cocoa, puede usar esta propiedad.fuente
subjectTypeya no está disponible ydynamicTypeprovoca 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
isKindOfClassen Obj-C.Y esto es equivalente a
conformsToProtocol, oisMemberOfClassfuente
as?lanzamiento condicional también hace lo mismoisKindOfClass, solo proporciona el resultado del lanzamiento si tiene éxito.isMemberOfClasses la condiciónobject.dynamicType == ClassName.self.Swift 3:
fuente
isexiste 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 ), elisoperador es más preferible.Depende del caso de uso. Pero supongamos que desea hacer algo útil con sus tipos "variables". La
switchdeclaració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 Stringcaso.fuente
Si recibe una advertencia de "siempre verdadero / falla", es posible que deba enviar a Any antes de usar
isfuente
fuente