AnyObject e Any in Swift


91

Non capisco quando usare AnyObject e quando usare Any in Swift.

Nel mio caso, ho un dizionario

[Corda: ???]

??? : Può essere Int, Double, Float, String, Array, Dictionary

Qualcuno può spiegarmi la differenza tra Any e AnyObject e quale usare nel mio caso.

Alak

Risposte:


114

AnyObjectè solo per i tipi di riferimento (classi), Anyè sia per i tipi di valore che per i tipi di riferimento.

Quindi dovresti andare per [String: Any].

Digitare Casting per Any e AnyObject

Swift fornisce due tipi speciali per lavorare con tipi non specifici:

  • Any può rappresentare un'istanza di qualsiasi tipo, inclusi i tipi di funzione.
  • AnyObject può rappresentare un'istanza di qualsiasi tipo di classe.

NOTA:

Usa Anye AnyObjectsolo quando hai bisogno esplicitamente del comportamento e delle capacità che forniscono. È sempre meglio essere specifici sui tipi con cui ti aspetti di lavorare nel tuo codice.

Dal linguaggio di programmazione Swift : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

Si noti inoltre che quando si lavora con l'API Cocoa, è comune ricevere un Array of AnyObject, questo perché gli array Objective-C NON sono tipizzati. Quindi devi lanciarli nel tipo di array che ti aspetti.

-

EDIT: (22 dicembre 2015)
Nell'ultima affermazione, nota che questo sta cambiando con Swift 2.0 e Xcode 7.
Apple ha introdotto generici "leggeri" in Objective-C, quindi molte API Cocoa ora restituiscono già il tipo corretto.

EDIT: (18 ottobre 2016)
Nota che, a partire da Swift 3.0, gli Objective-C idora vengono importati come Any, non più come AnyObject.


18
Nota che String, Arraye Dictionarynon sono classi, per questi usano Any.
Zaf

6
Né Int, Double e Float lo sono.
Teejay

11
Sì, ma di solito è ovvio. Non è così ovvio che NSString, NSArraye NSDictionarysono classi, ma le versioni di Swift con funzionalità simili non sono classi e questo fa scattare molti sviluppatori.
Zaf

1
Qualcuno rappresenta anche gli optional? O dovrebbe essere espresso come Any?

1
@robdashnash Any non rappresenta gli optional. ? dovrebbe essere aggiunto per renderlo opzionale
crypt

46

Che tu usi Anyo AnyObjectdipenda dall'uso previsto:

Se il dizionario sarà usato solo nel codice Swift, quindi si dovrebbe utilizzare Anyperché i tipi ( Int, Double, Float, String, Array, e Dictionary) non sono oggetti.

Se passerai il tuo dizionario a routine Objective-C che prevedono un NSDictionary, allora dovresti usare AnyObject.

Quando si import Foundationo import UIKito import Cocoa, è possibile dichiarare il vostro matrice come [String: AnyObject], ma in questo caso Swift è trattare la vostra Int, Double, Floatletterali come NSNumber, i vostri Strings come NSString, i vostri Arrays come NSArray, e le vostre dizionari come NSDictionary, che sono tutti oggetti. Un dizionario che utilizza AnyObjectcome tipo di valore è convertibile in NSDictionary, ma Anynon lo è.


1

Secondo la documentazione Swift di Apple,

  • Any può rappresentare un'istanza di qualsiasi tipo, inclusi i tipi di funzione e i tipi facoltativi.
  • AnyObject può rappresentare un'istanza di qualsiasi tipo di classe.

Per maggiori dettagli, controlla questo: Blog


1

Controlla questa risposta SO :

I generici sono indipendenti dai tipi, il che significa che se passi una stringa come generica e provi a usare come numero intero, il compilatore si lamenterà e non sarai in grado di compilare il tuo (che è buono). (Ciò accade perché Swift utilizza la digitazione statica ed è in grado di darti un errore del compilatore). Se usi AnyObject il compilatore non ha idea se questo oggetto può essere trattato come una stringa o come un intero e fondamentalmente ti permetterà di fare quello che vuoi con esso (il che non va bene) come se provassi a usare un oggetto che è stato passato come String quando è un numero intero l'applicazione andrà in crash. (Questo accade perché Swift utilizza la digitazione dinamica e ti darà solo un errore di runtime)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.