Les tableaux de longueur fixe ne sont pas encore pris en charge. Qu'est-ce que cela signifie réellement? Non pas que vous ne puissiez pas créer un tableau de n
beaucoup de choses - évidemment, vous pouvez simplement le faire let a = [ 1, 2, 3 ]
pour obtenir un tableau de trois Int
s. Cela signifie simplement que la taille du tableau n'est pas quelque chose que vous pouvez déclarer comme information de type .
Si vous voulez un tableau de nil
s, vous aurez d'abord besoin d'un tableau d'un type optionnel - [SKSpriteNode?]
, pas [SKSpriteNode]
- si vous déclarez une variable de type non optionnel, que ce soit un tableau ou une valeur unique, cela ne peut pas être nil
. (Notez également que [SKSpriteNode?]
c'est différent de [SKSpriteNode]?
... vous voulez un tableau d'options, pas un tableau facultatif.)
Swift est très explicite par conception sur le fait d'exiger l'initialisation des variables, car les hypothèses sur le contenu des références non initialisées sont l'une des façons dont les programmes en C (et dans certains autres langages) peuvent devenir bogués. Vous devez donc demander explicitement un [SKSpriteNode?]
tableau contenant 64 nil
s:
var sprites = [SKSpriteNode?](repeating: nil, count: 64)
Cela renvoie en fait un [SKSpriteNode?]?
, cependant: un tableau facultatif de sprites facultatifs. (Un peu étrange, car init(count:,repeatedValue:)
il ne devrait pas être possible de renvoyer nil.) Pour travailler avec le tableau, vous devrez le déballer. Il y a plusieurs façons de le faire, mais dans ce cas, je préfère la syntaxe de liaison facultative:
if var sprites = [SKSpriteNode?](repeating: nil, count: 64){
sprites[0] = pawnSprite
}
sprites
dans votre éditeur / terrain de jeu pour voir son type inféré - c'est en faitSKSpriteNode?[]?
: un tableau facultatif de sprites facultatifs. Vous ne pouvez pas indiquer un optionnel, vous devez donc le dérouler ... voir la réponse modifiée.Le mieux que vous puissiez faire pour l'instant est de créer un tableau avec un décompte initial répétant nul:
Vous pouvez ensuite indiquer les valeurs que vous souhaitez.
Dans Swift 3.0 :
la source
Cette question a déjà été répondue, mais pour quelques informations supplémentaires au moment de Swift 4:
En cas de performances, vous devez réserver de la mémoire pour le tableau, en cas de création dynamique, comme l'ajout d'éléments avec
Array.append()
.Si vous connaissez la quantité minimale d'éléments que vous y ajouterez, mais pas la quantité maximale, vous devriez plutôt utiliser
array.reserveCapacity(minimumCapacity: 64)
.la source
Déclarez un SKSpriteNode vide, il n'y aura donc pas besoin de déballer
la source
Pour l'instant, le plus proche sémantiquement serait un tuple avec un nombre fixe d'éléments.
Mais c'est (1) très inconfortable à utiliser et (2) la disposition de la mémoire n'est pas définie. (du moins inconnu de moi)
la source
Swift 4
Vous pouvez en quelque sorte le considérer comme un tableau d'objets contre un tableau de références.
[SKSpriteNode]
doit contenir des objets réels[SKSpriteNode?]
peut contenir soit des références à des objets, soitnil
Exemples
Création d'un tableau avec 64 par défaut
SKSpriteNode
:Création d'un tableau avec 64 emplacements vides (aka optionnels ):
Conversion d'un tableau d'options en un tableau d'objets (réduction
[SKSpriteNode?]
en[SKSpriteNode]
):Le
count
résultatflatSprites
dépend du nombre d'objets dansoptionalSprites
: les options vides seront ignorées, c'est-à-dire ignorées.la source
flatMap
est obsolète, il doit être mis à jourcompactMap
si possible. (Je ne peux pas modifier cette réponse)Si vous voulez un tableau de taille fixe et l'initialisez avec des
nil
valeurs, vous pouvez utiliser unUnsafeMutableBufferPointer
, allouer de la mémoire pour 64 nœuds avec lui, puis lire / écrire depuis / vers la mémoire en indiquant l'instance de type pointeur. Cela a également l'avantage d'éviter de vérifier si la mémoire doit être réallouée, ce qui leArray
fait. Je serais cependant surpris si le compilateur n'optimise pas cela pour les tableaux qui n'ont plus d'appels à des méthodes pouvant nécessiter un redimensionnement, autre que sur le site de création.Ce n'est cependant pas très convivial. Alors, faisons un emballage!
Maintenant, c'est une classe, et non une structure, il y a donc une surcharge de comptage de références encourue ici. Vous pouvez le changer en un à la
struct
place, mais comme Swift ne vous offre pas la possibilité d'utiliser des initialiseurs de copie etdeinit
sur des structures, vous aurez besoin d'une méthode de désallocation (func release() { memory.deallocate() }
), et toutes les instances copiées de la structure référenceront la même mémoire.Maintenant, cette classe peut être juste assez bonne. Son utilisation est simple:
Pour plus de protocoles auxquels implémenter la conformité, consultez la documentation Array (faites défiler jusqu'à Relations ).
la source
Une chose que vous pourriez faire serait de créer un dictionnaire. Peut-être un peu bâclé compte tenu de votre recherche de 64 éléments, mais cela fait le travail. Je ne sais pas si c'est la "façon préférée" de le faire mais cela a fonctionné pour moi en utilisant un tableau de structures.
la source
tasks[65] = foo
dans ce cas et le cas d'un tableau à partir de la question.