web-dev-qa-db-fra.com

AnyObject et Any in Swift

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

86
Alak

AnyObject concerne uniquement les types de référence (classes), Any concerne les types valeur et référence.

Donc, vous devriez aller pour [String: Any].

Casting de types pour Any et AnyObject

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

  • Any peut représenter une instance de tout type, y compris des types de fonction.
  • AnyObject peut représenter une instance de tout type de classe.

NOTE:

Utilisez Any et AnyObject uniquement lorsque vous avez explicitement besoin du comportement et des fonctionnalités qu’ils fournissent. Il est toujours préférable de spécifier les types de fichiers que vous souhaitez utiliser dans votre code.

De Le Swift Langage de programmation : 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 de AnyObject, car les tableaux Objective-C ne sont PAS typés. Vous devez donc les convertir dans le type de tableau que vous attendez.

-

EDIT: (22 décembre 2015)
Sur le dernier relevé, notez que cela change avec Swift 2.0 et Xcode 7.
Apple a introduit génériques "légers" dans Objective-C, de sorte que de nombreuses API Cocoa retournent déjà le type correct.

EDIT: (18 octobre 2016)
Notez que, à partir de Swift 3.0, les Objective-C id] sont maintenant importés sous le format Any et non plus sous la forme AnyObject.

106
Teejay

Que vous utilisiez Any ou AnyObject dépend de votre utilisation prévue:

Si votre dictionnaire sera utilisé uniquement dans le code Swift, vous devez alors utiliser Any parce que vos types (Int, Double, Float, String, Array et Dictionary) ne sont pas des objets.

Si vous passez votre dictionnaire aux routines Objective-C qui s’attendent à un NSDictionary, vous devez alors utiliser AnyObject.

Quand vous import Foundation ou import UIKit ou import Cocoa, il est possible de déclarer votre tableau comme [String: AnyObject], mais dans ce cas Swift traite vos littéraux Int, Double, Float comme NSNumber, votre Strings comme NSString, votre Arrays comme NSArray et vos dictionnaires comme NSDictionary, qui sont tous des objets. Un dictionnaire utilisant AnyObject car le type de valeur est convertible en NSDictionary, mais celui qui utilise Any ne l'est pas.

45
vacawama

Selon la documentation d'Apple Swift,

  • Any peut représenter une instance de tout type, y compris des types de fonction et des types facultatifs.
  • AnyObject peut représenter une instance de tout type de classe.

Pour plus de détails s'il vous plaît vérifier ceci: Blog

1
Rohit Sisodia

Les génériques sont protégés contre le typage, ce qui signifie que si vous transmettez une chaîne en tant que générique et essayez de l'utiliser en tant qu'entier, le compilateur se plaindra et vous ne pourrez pas le compiler (ce qui est bien). (Cela se produit car Swift utilise le typage statique et peut vous donner une erreur du compilateur)

Si vous utilisez AnyObject, le compilateur ne sait pas si cet objet peut être traité comme une chaîne ou comme un entier et vous permettra en principe de faire ce que vous voulez (ce qui est mauvais) comme si vous essayiez d'utiliser un objet qui a été passé en tant que chaîne quand il s'agit d'un entier, l'application se bloque. (Cela se produit car Swift utilise la frappe dynamique et ne vous donnera qu'une erreur d'exécution)

0
Ved Rauniyar