【问题标题】:Swift: how to reserveCapacity() for SKSpriteNodesSwift:如何为 SKSpriteNodes 保留Capacity()
【发布时间】:2019-06-27 17:19:52
【问题描述】:

我正在尝试使用精灵的预设索引将精灵数据分配给全局数组。我将数组初始化为 SKSpriteNodes 数组。我将 SKSpriteNodes 发送到这个数组,每个精灵都有一个这个数组的索引。我意识到我也可以使用循环而不是设置索引来执行此操作,但我想先弄清楚数组分配。

我尝试了 reserveCapacity(27),因为将有 27 个精灵要传入,但是当我尝试时,我得到一个索引超出范围错误。

class GameScene: SKScene
{

    //main array that will be used to store sprite button data
    var mainArr: [SKSpriteNode] = [SKSpriteNode]()


..


    override func didMove(to view: SKView)
        {
            mainArr.reserveCapacity(27)

         ...

        if let name = touchedNode.name
        {

            if name == "pea"
            {
                peaFlag = peaFlag * -1
                manageArrayData(name: pea, nameFlag: peaFlag, nameIndex: peaInd)/*may need to add images*/
            }
    ...}//end touchNode


 ...} //end didMoveTo 


func manageArrayData(name: SKSpriteNode, nameFlag: Int, nameIndex: Int)
    {

        if nameFlag >= 0
        {
            print(nameFlag)
            print(nameIndex)
            print("in array")
            mainArr.insert(name, at: nameIndex)
            //dump(mainArr)
            print("-=-=-=-in-=-=-=-")
        }

正如我所说,错误是:致命错误:数组索引超出范围 2019-06-27 09:54:09.414271-0700 Select[36307:1432579] 致命错误:数组索引超出范围

我认为错误是因为 reserveCapacity() 是 Int 类型,而我正在尝试为 SKSpriteNode 分配内存...因此我分配的内容没有空间,因此“超出范围”

有多个“按钮”(使用 SKSpriteNodes),所以我为按钮创建了一个 if 树。

【问题讨论】:

    标签: arrays swift xcode memory-management anyobject


    【解决方案1】:

    reserveCapacity 不在数组中创建条目。如果您添加那么多条目,它只是确保您不需要执行重新分配(和可能的重新定位)。通常仅出于性能原因才需要它。它不会改变索引的工作方式。

    如果你想要数组中的空条目,你需要添加它们。请参阅Array(repeating:count:) 以创建具有一些固定值的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多