swift value-type reference-type

AnyObject y Any en Swift



value-type reference-type (4)

De acuerdo con la documentación Swift de Apple,

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

Para más detalles, verifique esto: Blog

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

Mi caso, tengo un diccionario

[Cuerda: ???]

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

alguien me puede explicar la diferencia entre Any y AnyObject y witch one para usar en mi caso.

Alak


Los genéricos son seguros, lo que significa que si pasa una cadena como un genérico y trata de usar como un entero, el compilador se quejará y no podrá compilar (lo cual es bueno). (Esto sucede porque Swift usa tipado estático y puede proporcionarle un error de compilación)

Si usa AnyObject, el compilador no tiene idea de que este objeto puede tratarse como una cadena o como un entero y, básicamente, le permitirá hacer lo que quiera con él (lo que es malo) como si tratara de usar un objeto que ha sido pasado como una Cadena cuando es un Entero, la aplicación se bloqueará. (Esto sucede porque Swift usa tipeo dinámico y solo le dará un error de tiempo de ejecución)


Si usa Any o AnyObject depende de su uso previsto:

Si su diccionario se usará solo dentro del código Swift, entonces debe usar Any porque sus tipos ( Int , Double , Float , String , Array y Dictionary ) no son objetos.

Si va a pasar su diccionario a rutinas Objective-C que esperan un NSDictionary , entonces debe usar AnyObject .

Cuando import Foundation o import UIKit o import Cocoa , es posible declarar su matriz como [String: AnyObject] , pero en este caso Swift está tratando sus literales Int , Double , Float como NSNumber , sus String como NSString , su Array s como NSArray , y sus diccionarios como NSDictionary , todos los cuales son objetos. Un diccionario que usa AnyObject como tipo de valor es convertible a NSDictionary , pero uno que usa Any no lo es.


AnyObject es solo para tipos de referencia (clases), Any es para ambos tipos de valor y referencia.

Así que deberías ir por [String: Any] .

Escribir Casting 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 funciones.
  • AnyObject puede representar una instancia de cualquier tipo de clase.

NOTA:

Utilice Any y AnyObject solo cuando necesite explícitamente el comportamiento y las capacidades que proporcionan. Siempre es mejor ser específico acerca de los tipos con los que espera trabajar en su código.

Del 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 un Array of AnyObject, esto se debe a que los arreglos Objective-C NO están tipificados. Por lo tanto, debe convertirlos al 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 introdujo los genéricos ''Lightweight'' en Objective-C, por lo que ahora muchas API de Cocoa devuelven el tipo correcto.

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