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
yAnyObject
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
.