【问题标题】:Swift init Array with capacity具有容量的 Swift 初始化数组
【发布时间】:2014-06-09 16:18:44
【问题描述】:

如何快速初始化具有特定容量的数组?

我试过了:

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

但得到错误

expected declaration 

【问题讨论】:

  • 您收到该错误是因为您在函数外部(在类、结构、枚举或顶层)进行方法调用。在函数中尝试此操作,或者将 reserveCapacity 调用移动到类的 init() 方法中。

标签: arrays swift


【解决方案1】:

怎么样:

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 一起使用。

【讨论】:

  • 我发现它只调用了一次Square()。所以这个数组中的所有实例都指向同一个引用。
  • 这是不正确的。这将创建一个包含 16 个值的数组。 OP 要求创建一个新的空数组,其 容量 可容纳 16 个值。我相信这在 Swift 中是无法实现的。只能创建空数组and_then保留容量。
【解决方案2】:

斯威夫特 3 / 斯威夫特 4 / 斯威夫特 5

var grid : [Square] = []
grid.reserveCapacity(16)

我相信也可以一条线实现。

【讨论】:

  • 我对@9​​87654322@ 接受的答案有疑问,所以这对我来说是一个更好的选择。
  • 为什么是可选的?正如所写,这什么都不做
  • 我真的认为这应该是公认的答案。其他答案创建已经初始化的数组,即使预先填充了 nil,仍然是一个计数为 n 的数组。应该注意的是,对 reserveCapacity 的调用应该放在一个函数中,因为 OP 在这个函数调用的位置上有问题。
  • 这个答案是非常错误的。在这种情况下,网格为零。这意味着 reserveCapacity(16) 由于可选的工作方式而实际上从未被调用。网格需要初始化。 var grid : [Square]? = []
  • @Brett 如果您阅读了这个问题,主要的痛点是初始化具有特定容量的数组。我认为这个问题不是在寻找关于初始化的答案。不过感谢您的添加,感觉值得一提的是您需要初始化数组才能使用它。
【解决方案3】:
var actions:[AnyObject?] = [AnyObject?](count: 3, repeatedValue: nil)

【讨论】:

    【解决方案4】:

    试试:

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

    【讨论】:

      【解决方案5】:

      警告

      如果您使用 Array(repeating:count:) 初始化器,您将在使用常见的数组方法(例如 append()时遇到奇怪和意外的行为,这将通过在创建的容量之外添加新值而不是数组中的较早点。

      更好的做法

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

      如果您保留容量,如果您能够提前准确预测阵列的大小,您可以将重新分配过程从平均 O(N)O(NlogN) 降至零。 Here is the documentation.

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

      var myArray: [Double] = []
      myArray.reserveCapacity(10000)
      
      Because array capacity expands as needed and fast, however this really isn't necessary in a vast majority of cases. 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-20
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 2015-10-18
        • 1970-01-01
        相关资源
        最近更新 更多