2014-06-09 20 views
29

Làm cách nào để khởi tạo một mảng nhanh chóng với một dung lượng cụ thể?Swift init Array với công suất

Tôi đã thử:

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

nhưng nhận được lỗi

expected declaration 
+1

Bạn nhận được lỗi đó bởi vì bạn đang thực hiện cuộc gọi phương thức bên ngoài một hàm (trong một lớp, cấu trúc, enum hoặc ở cấp cao nhất). Hãy thử điều này bên trong một hàm, hoặc, di chuyển cuộc gọi reserveCapacity vào phương thức init() của lớp của bạn. – Bill

Trả lời

39

Làm thế nào về:

class Square { 

} 

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

Mặc dù điều này sẽ gọi các nhà xây dựng cho mỗi vuông.

Nếu bạn đã thực hiện mảng có trường Quảng trường tùy chọn bạn có thể sử dụng:

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

EDIT: Với Swift3 chữ ký khởi tạo này đã thay đổi đến sau:

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

hoặc

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

Tất nhiên, cả hai cũng hoạt động với Square?nil.

+0

Tôi thấy rằng nó chỉ gọi là 'Square()' một lần. Vì vậy, tất cả các cá thể trong mảng này trỏ đến cùng một tham chiếu. –

+1

Điều này không chính xác. Điều này tạo ra một mảng với 16 giá trị. OP đã yêu cầu tạo một mảng trống mới với _capacity_ để giữ 16 giá trị. Tôi tin rằng điều này không thể được thực hiện trong Swift. Bạn chỉ có thể tạo mảng trống _and_then_ dự trữ dung lượng. –

3

Hãy thử:

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) 

Tôi tin rằng nó có thể đạt được trong một dòng là tốt.

+0

Tôi có vấn đề với câu trả lời được chấp nhận với 'lặp đi lặp lại: nil' vì vậy đây là một lựa chọn tốt hơn cho tôi. –

Các vấn đề liên quan