AnyObject y Any en Swift

92

No entiendo cuándo usar AnyObject y cuándo usar Any en Swift.

En mi caso tengo un diccionario

[Cuerda: ???]

??? : Puede ser Int, Double, Float, String, Array, Dictionary

¿Alguien puede explicarme la diferencia entre Any y AnyObject y cuál usar en mi caso?

Alak

Alak
fuente

Respuestas:

116

AnyObjectes solo para tipos de referencia (clases), Anyes tanto para tipos de valor como de referencia.

Entonces deberías ir a por [String: Any].

Conversión de tipos para Any y AnyObject

Swift proporciona dos tipos especiales para trabajar con tipos no específicos:

  • Any puede representar una instancia de cualquier tipo, incluidos los tipos de función.
  • AnyObject puede representar una instancia de cualquier tipo de clase.

NOTA:

Use Anyy AnyObjectsolo cuando necesite explícitamente el comportamiento y las capacidades que brindan. Siempre es mejor ser específico sobre los tipos con los que espera trabajar en su código.

Desde el lenguaje de programación Swift : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

También tenga en cuenta que cuando trabaja con Cocoa API, es común recibir una matriz de AnyObject, esto se debe a que las matrices Objective-C NO están tipificadas. Por lo tanto, debe convertirlos en el tipo de matriz que espera.

-

EDITAR: (22 de diciembre de 2015)
En la última declaración, tenga en cuenta que esto está cambiando con Swift 2.0 y Xcode 7.
Apple ha introducido genéricos 'ligeros' en Objective-C, por lo que muchas API de Cocoa ahora ya devuelven el tipo correcto.

EDITAR: (18 de octubre de 2016)
Tenga en cuenta que, a partir de Swift 3.0, los Objective-C idahora se importan como Any, ya no como AnyObject.

Teejay
fuente
18
Tenga en cuenta que String, Arrayy Dictionaryno son clases, para estas se usa Any.
zaph
6
Ni Int, Double y Float lo son.
Teejay
12
Sí, pero eso suele ser obvio. No es tan obvio que NSString, NSArrayy NSDictionaryson clases, pero las versiones de Swift igualmente funcionales no son clases y eso hace tropezar a muchos desarrolladores.
zaph
1
¿Any también representa opcionales? ¿O debería expresarse como Cualquiera?
1
@robdashnash Any no representa opcionales. ? debe agregarse para que sea opcional
cripta
47

Ya sea que use Anyo AnyObjectdepende de su uso previsto:

Si va a utilizar su diccionario solamente en el código Swift, entonces debería usar Anydebido a sus tipos ( Int, Double, Float, String, Array, y Dictionary) no son objetos.

Si va a pasar su diccionario a las rutinas de Objective-C que esperan un NSDictionary, entonces debería usar AnyObject.

Cuando import Foundationo import UIKito import Cocoa, es posible declarar la matriz como [String: AnyObject], pero en este caso Swift ha tratado su Int, Double, Floatliterales como NSNumber, sus Strings como NSString, sus Arrays como NSArray, y de los diccionarios como NSDictionary, todos los cuales son objetos. Un diccionario que usa AnyObjectcomo tipo de valor es convertible a NSDictionary, pero uno que usa Anyno lo es.

vacawama
fuente
1

Según la documentación Swift de Apple,

  • Cualquiera puede representar una instancia de cualquier tipo, incluidos los tipos de función y los tipos opcionales.
  • AnyObject puede representar una instancia de cualquier tipo de clase.

Para obtener más detalles, consulte esto: Blog

Rohit Sisodia
fuente
1

Marque esta respuesta SO :

Los genéricos son seguros para los tipos, lo que significa que si pasa una cadena como genérico e intenta usarla como un entero, el compilador se quejará y no podrá compilar su (lo cual es bueno). (Esto sucede porque Swift usa escritura estática y puede darle un error de compilación). Si usa AnyObject, el compilador no tiene idea de si este objeto puede tratarse como una cadena o como un entero y básicamente le permitirá hacer lo que quiera con él (lo cual es malo) como si intentara usar un objeto que ha sido si se pasa como una cadena cuando es un entero, la aplicación se bloqueará. (Esto sucede porque Swift usa la escritura dinámica y solo le dará un error de tiempo de ejecución)

Ved Rauniyar
fuente