如何使用特定容量在swift中初始化数组?
我试过了:
var grid = Array <Square> ()
grid.reserveCapacity(16)
但得到错误
expected declaration
答案 0 :(得分:48)
怎么样:
class Square {
}
var grid = Array<Square>(count: 16, repeatedValue: Square());
虽然这会调用每个方块的构造函数。
如果您使阵列具有可选的Square实例,则可以使用:
var grid2 = Array<Square?>(count: 16, repeatedValue: nil);
编辑:使用Swift3,此初始化程序签名已更改为以下:
var grid3 = Array<Square>(repeating: Square(), count: 16)
或
var grid4 = [Square](repeating: Square(), count: 16)
当然,两者都适用于Square?
和nil
。
答案 1 :(得分:15)
Swift 3 / Swift 4 / Swift 5
var grid : [Square]?
grid?.reserveCapacity(16)
我相信它也可以在一行中实现。
答案 2 :(得分:12)
var actions:[AnyObject?] = [AnyObject?](count: 3, repeatedValue: nil)
答案 3 :(得分:3)
尝试:
var grid = Array<Square>(count: 16, repeatedValue: aSquare)
答案 4 :(得分:2)
警告:
如果使用Array(repeating:count:)
初始化程序,则在使用常见的数组方法(例如append(
)时会遇到奇怪的意外行为,该方法会立即通过在创建的值之外添加新值来达到保留容量的目的。容量,而不是数组中的较早点。
更好的实践:
快速阵列可以动态加倍以满足阵列的存储需求,因此在大多数情况下不必保留容量。但是,如果您不提前指定大小,则会耗费一定的速度,因为系统需要查找一个具有足够空间的新存储位置,并在每次翻倍时以O(N)
的速度逐项复制每个项目。 。平均而言,随着数组大小加倍,重新分配趋向于大O(LogN)
。
如果您保留容量,则可以提前平均地将重新分配过程从O(N)
或O(NlogN)
降低到零,如果您可以提前准确地预测阵列的大小。 Here is the documentation。
您可以通过在数组上调用reserveCapacity(:)
来实现。
var myArray: [Double] = []
myArray.reserveCapacity(10000)