Swift: ошибка индекса вне диапазона при заполнении двумерного массива - PullRequest
0 голосов
/ 04 декабря 2018

Я только начал изучать Swift, и я хотел бы написать код игры BubbleBreaker, которую я уже создал на Java и C # несколько лет назад.

Для этого я хотел создать двумерный массивBubble (который получен из SKSpriteNode), однако, когда я пытаюсь заполнить массив, я всегда получаю «ошибка индекса вне диапазона» в index [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)
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вместо присвоения нового значения как несуществующего значения, добавьте новый пустой массив 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)
    }
}
0 голосов
/ 04 декабря 2018

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)
}

Это создаст массив массивов.

...