具有容量的Swift init Array

JuJ*_*oDi 36 arrays swift

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

我试过了:

var grid = Array <Square> ()
grid.reserveCapacity(16)
Run Code Online (Sandbox Code Playgroud)

但得到错误

expected declaration 
Run Code Online (Sandbox Code Playgroud)

Ben*_*ton 49

怎么样:

class Square {

}

var grid = Array<Square>(count: 16, repeatedValue: Square());
Run Code Online (Sandbox Code Playgroud)

虽然这会调用每个方块的构造函数.

如果您使阵列具有可选的Square实例,则可以使用:

var grid2 = Array<Square?>(count: 16, repeatedValue: nil);
Run Code Online (Sandbox Code Playgroud)

编辑:使用Swift3,此初始化程序签名已更改为以下内容:

var grid3 = Array<Square>(repeating: Square(), count: 16)
Run Code Online (Sandbox Code Playgroud)

要么

var grid4 = [Square](repeating: Square(), count: 16)
Run Code Online (Sandbox Code Playgroud)

当然,两者都可以Square?nil.

  • 这是不正确的.这将创建一个包含16个值的Array.OP要求使用_capacity_创建一个新的空数组以保存16个值.我相信这在Swift中无法实现.您只能创建空数组_and_then_保留容量. (4认同)

Mer*_*lik 17

Swift 3/Swift 4

var grid : [Square]?
grid?.reserveCapacity(16)
Run Code Online (Sandbox Code Playgroud)

我相信它也可以在一行中实现.

  • 为什么有选择性?正如所写,这没有任何作用 (4认同)
  • 我对“重复:无”的接受答案有疑问,所以这对我来说是一个更好的选择。 (2认同)

Kva*_*ant 12

var actions:[AnyObject?] = [AnyObject?](count: 3, repeatedValue: nil)
Run Code Online (Sandbox Code Playgroud)


Sco*_*des 5

警告

如果您使用Array(repeating:count:)初始化程序,那么在使用常见的数组方法时,您会遇到奇怪和意外的行为,例如,append(通过在创建的容量之外添加新值而不是数组中较早的点,会立即破坏保留容量的目的。

更好的做法

Swift 数组会动态加倍以满足数组的存储需求,因此在大多数情况下您不一定需要预留容量。但是,如果您不提前指定大小,则会产生速度成本,因为系统需要找到一个具有足够空间的新内存位置,并在每次速度加倍时将每个项目逐一复制O(N)。平均而言,O(LogN)随着数组大小加倍,重新分配往往会变大。

如果您预留容量,如果您可以提前准确地预测阵列的大小,则可以将重新分配过程从零O(N)O(NlogN) 平均降低到零。 这是文档

您可以通过调用reserveCapacity(:)数组来做到这一点。

var myArray: [Double] = []
myArray.reserveCapacity(10000)

Run Code Online (Sandbox Code Playgroud)

由于阵列容量会根据需要快速扩展,因此在绝大多数情况下实际上没有必要。

对于 99.9% 尝试手动控制的用例来说,这不会提供任何明显的性能改进(如果有的话),并且不值得让其他开发人员感到困惑,因为他们不得不想知道为什么您如此关心这一点。