2014-06-09 11 views
29

Jak zainicjować tablicę w trybie szybkim o określonej pojemności?Swift init Array o pojemności

Próbowałem:

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

ale pojawia się błąd

expected declaration 
+1

Otrzymujesz ten błąd, ponieważ wywołujesz metodę poza funkcją (w klasie, strukturze, enumie lub na najwyższym poziomie). Wypróbuj to wewnątrz funkcji lub przenieś wywołanie reserveCapacity do metody init() twojej klasy. – Bill

Odpowiedz

39

Jak o:

class Square { 

} 

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

choć będzie to wywołać konstruktor dla każdego kwadratu.

Jeśli wykonane tablicę mieć opcjonalne wystąpień kwadratowe można użyć:

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

EDIT: Z Swift3 ten podpis inicjator został zmieniony na następujący:

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

lub

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

Oczywiście oba działają również z Square? i nil.

+0

Znalazłem, że to po prostu wywołanie 'Square()' na raz. Więc wszystkie wystąpienia w tej tablicy wskazują na to samo odniesienie. –

+1

To nie jest poprawne. Tworzy to tablicę z 16 wartościami. OP poprosił o utworzenie nowej pustej tablicy z _capacity_ do przechowywania 16 wartości. Uważam, że nie można tego dokonać w Swift. Możesz tylko utworzyć pustą tablicę _ i_then_ zarezerwować pojemność. –

3

Spróbuj:

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) 

wierzę, może być osiągnięty w jednej linii, jak również.

+0

Miałem problemy z zaakceptowaną odpowiedzią z 'repeatating: nil', więc to była dla mnie lepsza opcja. –

Powiązane problemy