Las matrices de longitud fija aún no son compatibles. ¿Qué significa eso realmente? No es que no pueda crear una matriz de n
muchas cosas; obviamente, puede hacerlo let a = [ 1, 2, 3 ]
para obtener una matriz de tres Int
s. Significa simplemente que el tamaño de la matriz no es algo que pueda declarar como información de tipo .
Si desea una matriz de nil
s, primero necesitará una matriz de un tipo opcional [SKSpriteNode?]
, no [SKSpriteNode]
, si declara una variable de tipo no opcional, ya sea una matriz o un valor único, no puede serlo nil
. (También tenga en cuenta que [SKSpriteNode?]
es diferente de [SKSpriteNode]?
... desea una matriz de opcionales, no una matriz opcional).
Swift es muy explícito por diseño sobre la necesidad de inicializar las variables, porque las suposiciones sobre el contenido de las referencias no inicializadas son una de las formas en que los programas en C (y algunos otros lenguajes) pueden tener errores. Por lo tanto, debe solicitar explícitamente una [SKSpriteNode?]
matriz que contenga 64 nil
s:
var sprites = [SKSpriteNode?](repeating: nil, count: 64)
Esto en realidad devuelve [SKSpriteNode?]?
, aunque: una matriz opcional de sprites opcionales. (Un poco extraño, ya init(count:,repeatedValue:)
que no debería poder devolver nil). Para trabajar con la matriz, deberá desenvolverla. Hay algunas formas de hacerlo, pero en este caso preferiría la sintaxis de enlace opcional:
if var sprites = [SKSpriteNode?](repeating: nil, count: 64){
sprites[0] = pawnSprite
}
sprites
en su editor / área de juegos para ver su tipo inferido - en realidad esSKSpriteNode?[]?
: una matriz opcional de sprites opcionales. No puede subíndice un opcional, por lo que debe desenvolverlo ... vea la respuesta editada.Lo mejor que podrá hacer por ahora es crear una matriz con un recuento inicial que se repite nulo:
A continuación, puede completar los valores que desee.
En Swift 3.0 :
fuente
Esta pregunta ya ha sido respondida, pero para obtener información adicional en el momento de Swift 4:
En caso de rendimiento, debe reservar memoria para la matriz, en caso de crearla dinámicamente, como agregar elementos con
Array.append()
.Si conoce la cantidad mínima de elementos que le agregará, pero no la cantidad máxima, debería usarla
array.reserveCapacity(minimumCapacity: 64)
.fuente
Declare un SKSpriteNode vacío, por lo que no será necesario desenvolver
fuente
Por ahora, semánticamente más cercano sería una tupla con un número fijo de elementos.
Pero esto es (1) muy incómodo de usar y (2) el diseño de la memoria no está definido. (al menos desconocido para mí)
fuente
Rápido 4
De alguna manera, puede pensar en ello como una matriz de objeto frente a una matriz de referencias.
[SKSpriteNode]
debe contener objetos reales[SKSpriteNode?]
puede contener referencias a objetos onil
Ejemplos
Creando una matriz con 64 por defecto
SKSpriteNode
:Creando una matriz con 64 ranuras vacías (también conocidas como opcionales ):
Convertir una matriz de opcionales en una matriz de objetos (colapsar
[SKSpriteNode?]
en[SKSpriteNode]
):El
count
resultadoflatSprites
depende del recuento de objetos enoptionalSprites
: los opcionales vacíos serán ignorados, es decir, saltados.fuente
flatMap
está en desuso, debería actualizarse acompactMap
si es posible. (No puedo editar esta respuesta)Si lo que desea es una matriz de tamaño fijo e inicializarla con
nil
valores, puede usar unaUnsafeMutableBufferPointer
, asignar memoria para 64 nodos con ella y luego leer / escribir desde / hacia la memoria subindicando la instancia del tipo de puntero. Esto también tiene la ventaja de evitar comprobar si la memoria debe reasignarse, lo queArray
hace. Sin embargo, me sorprendería si el compilador no optimiza eso para las matrices que no tienen más llamadas a métodos que pueden requerir un cambio de tamaño, excepto en el sitio de creación.Sin embargo, esto no es muy fácil de usar. Entonces, ¡hagamos un envoltorio!
Ahora, esta es una clase, y no una estructura, por lo que hay algunos gastos generales de recuento de referencias incurridos aquí. En su
struct
lugar, puede cambiarlo a a , pero debido a que Swift no le brinda la capacidad de usar inicializadores de copia ydeinit
en estructuras, necesitará un método de desasignación (func release() { memory.deallocate() }
), y todas las instancias copiadas de la estructura harán referencia a la misma memoria.Ahora, esta clase puede ser lo suficientemente buena. Su uso es sencillo:
Para obtener más protocolos para implementar la conformidad, consulte la documentación de Array (desplácese hasta Relaciones ).
fuente
Una cosa que podría hacer sería crear un diccionario. Puede ser un poco descuidado teniendo en cuenta que buscas 64 elementos, pero hace el trabajo. No estoy seguro si es la "forma preferida" de hacerlo, pero funcionó para mí usando una matriz de estructuras.
fuente
tasks[65] = foo
tanto en este caso como en el caso de una matriz de la pregunta.