AnyObject et Any dans Swift

91

Je ne comprends pas quand utiliser AnyObject et quand utiliser Any dans Swift.

Dans mon cas, j'ai un dictionnaire

[Chaîne: ???]

??? : Peut être Int, Double, Float, String, Array, Dictionary

Quelqu'un peut-il m'expliquer la différence entre Any et AnyObject et lequel utiliser dans mon cas.

Alak

Alak
la source

Réponses:

114

AnyObjectest uniquement pour les types de référence (classes), Anyest pour les types valeur et référence.

Alors tu devrais y aller [String: Any].

Casting de type pour Any et AnyObject

Swift fournit deux types spéciaux pour travailler avec des types non spécifiques:

  • Any peut représenter une instance de n'importe quel type, y compris les types de fonction.
  • AnyObject peut représenter une instance de n'importe quel type de classe.

REMARQUE:

Utilisez Anyet AnyObjectuniquement lorsque vous avez explicitement besoin du comportement et des capacités qu'ils fournissent. Il est toujours préférable d'être précis sur les types avec lesquels vous prévoyez de travailler dans votre code.

À partir du langage de programmation Swift : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

Notez également que lorsque vous travaillez avec l'API Cocoa, il est courant de recevoir un tableau d'AnyObject, car les tableaux Objective-C ne sont PAS typifiés. Vous devez donc les convertir dans le type de tableau que vous attendez.

-

EDIT: (22 décembre 2015)
Sur la dernière déclaration, notez que cela est en train de changer avec Swift 2.0 et Xcode 7.
Apple a introduit des génériques «légers» dans Objective-C, donc de nombreuses API Cocoa retournent déjà le type correct.

EDIT: (18 octobre 2016)
Notez que, depuis Swift 3.0, les Objective-C idsont désormais importés en tant que Any, et non plus en tant que AnyObject.

Teejay
la source
18
Notez que String, Arrayet Dictionaryne sont pas des classes, pour ceux-ci utilisent Any.
zaph le
6
Ni Int, Double et Float ne le sont.
Teejay
11
Ouais, mais c'est généralement évident. Ce n'est pas si évident que NSString, NSArrayet ce NSDictionarysont des classes, mais les versions Swift fonctionnelles de la même manière ne sont pas des classes et cela déclenche de nombreux développeurs.
zaph le
1
Any représente-t-il aussi des options? Ou devrait-il être exprimé par Any?
1
@robdashnash Any ne représente pas les options. ? devrait être ajouté pour le rendre facultatif
crypte
46

Que vous utilisiez Anyou AnyObjectdépend de votre utilisation prévue:

Si votre dictionnaire sera utilisé que dans le code Swift, vous devez utiliser Anyparce que vos types ( Int, Double, Float, String, Arrayet Dictionary) ne sont pas des objets.

Si vous passez votre dictionnaire aux routines Objective-C qui attendent un NSDictionary, alors vous devriez utiliser AnyObject.

Lorsque vous import Foundationou import UIKitou import Cocoa, il est possible de déclarer votre tableau comme [String: AnyObject], mais dans ce cas Swift traite votre Int, Double, Floatlittéraux comme NSNumber, vos Strings que NSString, vos Arrays comme NSArray, et vos dictionnaires que NSDictionary, tous sont des objets. Un dictionnaire utilisant AnyObjectcomme type de valeur est convertible en NSDictionary, mais un dictionnaire utilisant Anyne l'est pas.

vacawama
la source
1

Selon la documentation Swift d'Apple,

  • Any peut représenter une instance de n'importe quel type, y compris les types de fonction et les types facultatifs.
  • AnyObject peut représenter une instance de n'importe quel type de classe.

Pour plus de détails, veuillez consulter ceci: Blog

Rohit Sisodia
la source
1

Vérifiez cette réponse SO :

Les génériques sont de type sûr, ce qui signifie que si vous passez une chaîne en tant que générique et essayez de l'utiliser comme un entier, le compilateur se plaindra et vous ne pourrez pas compiler votre (ce qui est bien). (Cela se produit parce que Swift utilise le typage statique et est capable de vous donner une erreur de compilation). Si vous utilisez AnyObject, le compilateur n'a aucune idée du fait que cet objet peut être traité comme une chaîne ou comme un entier et vous permettra essentiellement d'en faire ce que vous voulez (ce qui est mauvais) comme si vous essayez d'utiliser un objet qui a été passé en tant que chaîne lorsqu'il s'agit d'un entier, l'application se bloque. (Cela se produit parce que Swift utilise la saisie dynamique et ne vous donnera qu'une erreur d'exécution)

Ved Rauniyar
la source