2014-06-09 10 views
29

Come inizializzare una matrice in rapido con una capacità specifica?Array Swift init con capacità

ho provato:

var grid = Array <Square>() 
grid.reserveCapacity(16) 

ma ottengo l'errore

expected declaration 
+1

Si sta verificando quell'errore perché si sta effettuando una chiamata di metodo all'esterno di una funzione (in una classe, in una struttura, in una enum o al livello superiore). Prova questo all'interno di una funzione, oppure sposta la chiamata reserveCapacity nel metodo init() della tua classe. – Bill

risposta

39

ne dite:

class Square { 

} 

var grid = Array<Square>(count: 16, repeatedValue: Square()); 

Anche se questo chiamerà il costruttore per ogni quadrato.

Se hai fatto la matrice avere istanze piazza opzionale è possibile utilizzare:

var grid2 = Array<Square?>(count: 16, repeatedValue: nil); 

EDIT: Con Swift3 questa firma di inizializzazione è cambiato al seguente:

var grid3 = Array<Square>(repeating: Square(), count: 16) 

o

var grid4 = [Square](repeating: Square(), count: 16) 

Naturalmente, entrambi funzionano anche con Square? e nil.

+0

Ho scoperto che chiama solo 'Square()' per una volta. Quindi tutte le istanze di questo array puntano allo stesso riferimento. –

+1

Questo non è corretto. Questo crea una matrice con 16 valori. OP ha chiesto di creare un nuovo array vuoto con _capacity_ per contenere 16 valori. Credo che questo non possa essere realizzato in Swift. È possibile solo creare l'array vuoto _and_then_ riservare la capacità. –

3

Prova:

var grid = Array<Square>(count: 16, repeatedValue: aSquare) 
11
var actions:[AnyObject?] = [AnyObject?](count: 3, repeatedValue: nil) 
6

Swift 3

var grid : [Square]? 
grid?.reserveCapacity(16) 

credo che può essere raggiunto in una sola riga pure.

+0

Ho riscontrato problemi con la risposta accettata con 'repeat: nil' quindi questa era una soluzione migliore per me. –

Problemi correlati