Swift:填充二维数组时出现索引超出范围错误

Posted

技术标签:

【中文标题】Swift:填充二维数组时出现索引超出范围错误【英文标题】:Swift: Index Out of Range Error when Populating Two-Dimensional Array 【发布时间】:2018-12-04 16:24:48 【问题描述】:

我刚开始学习 Swift,我想编写几年前我已经用 Java 和 C# 创建的游戏 BubbleBreaker。

为此,我想创建一个 Bubble 的二维数组(从 SKSpriteNode 派生),但是,当我尝试填充数组时,我总是在索引 [ 0][0]。有人能帮帮我吗?

class GameScene: SKScene 
    //game settings
    private var columns = 10
    private var rows = 16
    private var bubbleWidth = 0
    private var bubbleHeight = 0

    //bubble array
    private var bubbles = [[Bubble]]()

    override func didMove(to view: SKView) 
        initializeGame()
    

    private func initializeGame() 
        self.anchorPoint = CGPoint(x: 0, y: 0)        

        //Optimize bubble size
        bubbleWidth = Int(self.frame.width) / columns
        bubbleHeight = Int(self.frame.height) / rows

        if bubbleWidth < bubbleHeight 
            bubbleHeight = bubbleWidth
        
        else 
            bubbleWidth = bubbleHeight
        

        //Initialize bubble array
        for i in 0 ... columns-1 
            for j in 0 ... rows-1 
                let size = CGSize(width: bubbleWidth, height: bubbleHeight)
                let newBubble = Bubble(size: size)
                newBubble.position = CGPoint(x: i*bubbleWidth, y: j*bubbleHeight)

                bubbles[i][j] = newBubble // THIS IS WERE THE CODE BREAKS AT INDEX [0][0]

                self.addChild(newBubble)
            
        
    

【问题讨论】:

下面的答案为您指明了正确的方向,但关键是在 Swift 的标准库中没有“二维数组”之类的东西。 [[Bubble]] 是一个数组数组。那不是一回事(每个“行”可以是不同的长度)。如果您需要一个真正的二维数组(矩阵),那么您将需要一个专门的类型。有关 Matrix 类型的示例,请参阅 ***.com/a/53421491/97337。 【参考方案1】:

bubbles 一开始是空的。任何索引都没有。

将您的循环更新为如下内容:

//Initialize bubble array
for i in 0 ..< columns 
    var innerArray = [Bubble]()
    for j in 0 ..< rows 
        let size = CGSize(width: bubbleWidth, height: bubbleHeight)
        let newBubble = Bubble(size: size)
        newBubble.position = CGPoint(x: i*bubbleWidth, y: j*bubbleHeight)

        innertArray.append(newBubble)
        self.addChild(newBubble)
    
    bubbles.append(innerArray)

这构建了一个数组数组。

【讨论】:

【参考方案2】:

不要将新值分配为不存在的值,而是为每一列追加新的空数组Bubble,然后为每一行追加到该数组newBubble

for i in 0 ... columns-1 

    bubbles.append([Bubble]())

    for j in 0 ... rows-1 

        let size = CGSize(width: bubbleWidth, height: bubbleHeight)
        let newBubble = Bubble(size: size)
        newBubble.position = CGPoint(x: i*bubbleWidth, y: j*bubbleHeight)

        bubbles[i].append(newBubble)

        self.addChild(newBubble)
    

【讨论】:

以上是关于Swift:填充二维数组时出现索引超出范围错误的主要内容,如果未能解决你的问题,请参考以下文章

计算数组时出现“列表分配索引超出范围”错误

在我的应用程序中实现搜索时出现错误“索引 6 超出范围 [0 .. 5]”

处理二维数组时出现分段错误[关闭]

Python构建二维数组获取列表分配索引超出范围

滚动时将新项目添加到列表时出现数组索引超出范围异常

Swift CollectionView(致命错误:索引超出范围)