Stockage de différents types de valeur dans Array in Swift
Dans Swift Langage de Programmation, il est dit "Un tableau stocke plusieurs valeurs de même type dans une liste ordonnée." Mais j'ai trouvé que vous pouvez stocker plusieurs types de valeurs dans le tableau. C'est la description incorrecte?
par exemple
var test = ["a", "b", true, "hi", 1]
source d'informationauteur Boon
Vous devez vous connecter pour publier un commentaire.
De REPL
vous pouvez voir
test
estNSArray
qui est une sorte deAnyObject[]
ouNSObject[]
Ce qui se passe est que
Foundation
offre la possibilité de convertir le nombre et le type boolean dansNSNumber
. Le compilateur va effectuer la conversion chaque fois que nécessaire afin de rendre le code de la compilation.De sorte qu'ils ont maintenant un type commun de
NSObject
et donc déduit queNSArray
Votre code ne compile pas dans REPL sans
import Foundation
.mais vous pouvez le faire
Parce qu'ils ont un type commun, qui est
Any
.Remarque:
AnyObject[]
ne fonctionnera pas sansimport Foundation
.Pour initialiser un Tableau avec des types arbitraires, il suffit d'utiliser
var arbitraryArray = [Any]()
.AnyObject
est un type et vous pouvez créer un tableau qui contient ceux, qui (comme le nom de la classe implique) signifie qu'il peut contenir n'importe quel type d'objet. NSArrays ne sont pas de type lié et lorsque vous créez un tableau avec un mélange de types, il va générer unNSArray
au lieu d'uneArray
. Je ne voudrais pas compter sur cet, cependant, car il pourrait changer dans le futur (AnyObject[] est automatiquement comblé avec NSArray).Vous pouvez essayer ceci dans une aire de jeux (note:
dynamicType
renvoie "(Metatype)" et je n'étais pas sûr de savoir comment sortir de le taper donc je me suis appuyé sur l'erreur de compilation):La description est correcte, un Tableau stocke plusieurs valeurs de même type. La clé est qu'une valeur a plusieurs types. C'est, par exemple, un
String
a des types deString
etAny
; une instance d'une classeEllipse : Shape
a des types deEllipse
Shape
AnyObject
etAny
.Dans Swift 3, vous pouvez utiliser :