AnyObject
é apenas para tipos de referência (classes), Any
é para tipos de valor e de referência.
Então você deve ir [String: Any]
.
Casting de tipo para Any e AnyObject
O Swift oferece dois tipos especiais para trabalhar com tipos não específicos:
Any
pode representar uma instância de qualquer tipo, incluindo tipos de função.
AnyObject
pode representar uma instância de qualquer tipo de classe.
NOTA:
Use Any
e AnyObject
somente quando precisar explicitamente do comportamento e dos recursos que eles fornecem. É sempre melhor ser específico sobre os tipos com os quais você espera trabalhar em seu código.
Da linguagem de programação Swift :
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342
-
Observe também que quando você trabalha com a API Cocoa, é comum receber um Array de AnyObject, isso ocorre porque os arrays Objective-C NÃO são tipificados. Portanto, você precisa convertê-los para o tipo de array que você espera.
-
EDITAR: (22 de dezembro de 2015)
Na última declaração, observe que isso está mudando com Swift 2.0 e Xcode 7. A
Apple introduziu genéricos 'leves' em Objective-C, portanto, muitas APIs de cacau agora já retornam o tipo correto.
EDITAR: (18 de outubro de 2016)
Observe que, a partir do Swift 3.0, Objective-C id
s agora são importados como Any
, não mais como AnyObject
.
String
,Array
eDictionary
não são classes, para esses use Qualquer.NSString
,NSArray
eNSDictionary
são classes, as versões do Swift funcionalmente semelhantes não são classes e isso confunde muitos desenvolvedores.Se você usa
Any
ouAnyObject
depende do uso pretendido:Se o seu dicionário será usado apenas no código Swift, então você deve usar
Any
porque seus tipos (Int
,Double
,Float
,String
,Array
, eDictionary
) não são objetos.Se você for passar seu dicionário para rotinas Objective-C que esperam um
NSDictionary
, então você deve usarAnyObject
.Quando você
import Foundation
ouimport UIKit
ouimport Cocoa
, é possível declarar a matriz como[String: AnyObject]
, mas neste caso Swift está tratando o seuInt
,Double
,Float
literais comoNSNumber
, seusString
s comoNSString
, seusArray
s comoNSArray
, e seus dicionários comoNSDictionary
, todos os quais são objetos. Um dicionário usandoAnyObject
como tipo de valor é conversível emNSDictionary
, mas um usandoAny
não é.fonte
De acordo com a documentação do Swift da Apple,
Para obter mais detalhes, consulte: Blog
fonte
Verifique esta resposta SO :
fonte