Tengo una matriz compuesta de AnyObject
. Quiero iterar sobre él y encontrar todos los elementos que son instancias de matriz.
¿Cómo puedo verificar si un objeto es de un tipo dado en Swift?
swift
type-inference
typechecking
Encore PTL
fuente
fuente
Respuestas:
Si desea verificar un tipo específico, puede hacer lo siguiente:
Puedes usar "como!" y eso arrojará un error de tiempo de ejecución si
obj
no es de tipo[String]
También puede verificar un elemento a la vez:
fuente
?
no está presente? Suena comoas
y?
cuando se combina realizará una verificación de tiempo de ejecución. ¿Cuándo sería apropiado usaras
sin?
? Gracias por adelantado.as
sin el?
si no hay forma de que su programa pueda recuperarse del objeto que no es de ese tipo porque el programa se detendrá inmediatamente si no lo es. El uso de?
en laif
declaración permite que el programa continúe.?
en este caso realizaría una verificación de tipo "genérico", en caso afirmativo, a la cláusula if, si no, a la cláusula else. Sin lo?
contrario, nunca se ingresaría y, como señaló, provocará un error de tiempo de ejecución. Gracias de nuevo.?
permite la asignación para volvernil
haciendo que la sentencia if para el retornofalse
y, por tanto, que cae a través de la sentencia else. Sin embargo, creo que la explicación ayuda con el entendimiento, peroif let
en realidad es un caso especial en el compiladorEn Swift 2.2 - 5 ahora puede hacer:
Luego, para filtrar su matriz:
Si tiene varios tipos para verificar:
fuente
object
comoString
dentro de las llaves (al menos en Swift 2), mientras que con lalet
solución puede hacerlo.object
en el bloque está bien.object.uppercaseString
porque el tipo de la variable no está fundido a ese tipo, simplemente verificó que el objeto (señalado por la variable) es unString
Si solo desea saber si un objeto es un subtipo de un tipo dado, entonces hay un enfoque más simple:
“Utilice el operador de verificación de tipo (is) para verificar si una instancia es de cierto tipo de subclase. El operador de verificación de tipo devuelve verdadero si la instancia es de ese tipo de subclase y falso si no lo es ". Extracto de: Apple Inc. "El lenguaje de programación Swift". iBooks .
En lo anterior, la frase 'de cierto tipo de subclase' es importante. El compilador acepta el uso de
is Circle
yis Rectangle
porque ese valorshape
se declara comoShape
(una superclase deCircle
yRectangle
).Si está utilizando tipos primitivos, la superclase sería
Any
. Aquí hay un ejemplo:fuente
is
todavía funcionaría aquí? Gracias.object
comoAny
. Actualizado con un ejemplo.AnyObject
se sugiere, parece haber sido replicada debido a queAnyObject
no heredó deNSObject
. SiAny
es diferente, entonces esta sería una gran solución también. Gracias.Tengo 2 formas de hacerlo:
O:
Aquí hay un ejemplo detallado:
Editar: 3 ahora:
fuente
isKindOfClass
es un método delNSObject
protocolo; solo debería funcionar para las clases que lo adoptan (todas las clases que descienden de NSObject, más cualquier clase personalizada de Swift que lo adopte explícitamente)para swift4:
fuente
Asumir dibujar Triángulo es una instancia de UIView. Para verificar si drawTriangle es del tipo UITableView:
En Swift 3 ,
Esto también podría usarse para clases definidas por usted mismo. Puede usar esto para verificar las subvistas de una vista.
fuente
¿Por qué no utilizar la funcionalidad integrada creada especialmente para esta tarea?
fuente
Ten cuidado con esto:
Las cuatro últimas líneas devuelven verdadero, esto se debe a que si escribe
... imprime "falso", por supuesto, pero una Advertencia dice que falla la transmisión de CGRect a String. Por lo tanto, se conectan algunos tipos, y la palabra clave 'is' llama un molde implícito.
Deberías usar uno de estos:
fuente
Si solo desea verificar la clase sin recibir una advertencia debido al valor definido no utilizado (let someVariable ...), simplemente puede reemplazar el material let con un valor booleano:
Xcode propuso esto cuando utilicé let way y no utilicé el valor definido.
fuente
¿Por qué no usar algo como esto?
en Swift 3.
fuente
Swift 4.2, en mi caso, usando la función isKind.
Leer más https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind
fuente
myObject as? String
devuelvenil
simyObject
no es aString
. De lo contrario, devuelve unString?
, para que pueda acceder a la cadena en símyObject!
o emitirla de formamyObject! as String
segura.fuente
Swift 3:
fuente
Solo en aras de la exhaustividad basada en la respuesta aceptada y algunas otras:
Pero también puede (
compactMap
también "asigna" los valores quefilter
no):Y una versión usando
switch
:Pero atendiendo a la pregunta, para verificar si es una matriz (es decir
[String]
):O de manera más general (vea esta otra pregunta respuesta )
fuente
as?
no siempre le dará el resultado esperado porqueas
no prueba si un tipo de datos es de un tipo específico, sino solo si un tipo de datos se puede convertir o representar como un tipo específico.Considere este código, por ejemplo:
Cada tipo de datos conforme al
Error
protocolo se puede convertir en unNSError
objeto, por lo que esto siempre tendrá éxito . Sin embargo, eso no significa queerror
de hecho sea unNSError
objeto o una subclase de él.Una verificación de tipo correcta sería:
Sin embargo, esto verifica solo el tipo exacto. Si desea incluir también la subclase de
NSError
, debe usar:fuente
Si tiene una respuesta como esta:
y desea verificar el valor
is_stucked
que se leerá como AnyObject, todo lo que tiene que hacer es estofuente
Si no sabe que obtendrá una matriz de diccionarios o un solo diccionario en la respuesta del servidor, debe verificar si el resultado contiene una matriz o no.
En mi caso, siempre recibo una serie de diccionarios, excepto una vez. Entonces, para manejar eso, utilicé el siguiente código para Swift 3.
¿Aquí como? La matriz verifica si el valor obtenido es matriz (de elementos del diccionario). En otro caso, puede manejar si es un elemento de diccionario único que no se mantiene dentro de una matriz.
fuente
Swift 5.2 y Versión Xcode: 11.3.1 (11C504)
Aquí está mi solución de verificar el tipo de datos:
Espero que te ayude.
fuente