具有容量的Swift init Array

时间:2014-06-09 16:18:44

标签: arrays swift

如何使用特定容量在swift中初始化数组?

我试过了:

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

但得到错误

expected declaration 

5 个答案:

答案 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)