Может кто-нибудь определить, почему я получаю индекс вне диапазона? - PullRequest
1 голос
/ 21 октября 2019

Я пытаюсь прочитать данные из файла и сохранить их в двухмерном массиве.

Я сталкиваюсь с ошибкой "tempArr [x] = number!", Которая находится за пределами диапазона.

Я не могу найти причину проблемы.

    func loadData(){

        let path = "/Users/ushehri/Desktop/imageData/imageData/imageData/imageData.txt"

        let filemgr = FileManager.default
        if filemgr.fileExists(atPath: path){

            do {
                var x = 0

                let fullData = try String(contentsOfFile: path, encoding: String.Encoding.utf8)

                let readings = fullData.components(separatedBy: ",") as [String]
                var tempArr = [Double]()
                for i in 0..<readings.count {

                    let number = Double(readings[i])

                        tempArr[x] = number!
                        x = x + 1
                        if( x == 8){
                            x = 0
                        imageNumber.append(tempArr)
                        tempArr.removeAll()
                    }


                }

                for z in 0...readings.count{
                    for r in 0...8 {
                        print(imageNumber[z][r])
                    }
                }



            } catch let error as NSError{
                print("Error: \(error)")
            }

        }
    }

1 Ответ

1 голос
/ 21 октября 2019

Вы выделяете свой массив следующим образом:

var tempArr = [Double]()

Это просто создание массива, но хранилище не выделяется. Если вы пытаетесь получить доступ к массиву с помощью индекса элемента, вы пытаетесь получить доступ к нераспределенной памяти.

Если вам необходимо предварительно выделить массив, вы можете сделать это следующим образом:

let tmpArray = [Double](count: 8, repeatedValue: 0.0)

Лучше просто использовать метод добавления массива Array для добавления ваших элементов.

Есть некоторые другие проблемы с вашим кодом, которые вы, возможно, захотите устранить. Вы слепо полагаете, что число будет действительным:

let number = Double(readings[i])

Подумайте об использовании if let number или guard let number и обработайте неверные данные должным образом.

Вам также следует рассмотреть возможность присвоения 8 константе, поскольку вы используете это магическое число несколько раз в своем коде.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...