代码之家  ›  专栏  ›  技术社区  ›  ushehri

有人能确定我为什么把索引弄得超出范围吗?

  •  0
  • ushehri  · 技术社区  · 5 年前

    我试图从一个文件中读取数据并将其存储在二维数组中。

    我正面临一个错误“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 回复  |  直到 5 年前
        1
  •  1
  •   Gene Z. Ragan    5 年前

    您可以这样分配数组:

    var tempArr = [Double]()

    这只是创建一个数组,但没有分配存储。如果尝试使用元素索引访问数组,则表示尝试访问未分配的内存。

    如果必须预先分配数组,可以这样做:

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

    最好使用array的append方法来添加元素。

    您可能希望解决代码中的其他一些问题。你盲目地认为数字是有效的:

    let number = Double(readings[i])

    考虑使用 if let number guard let number 正确处理无效数据。

    你也应该考虑分配 8 一个常数,因为你在代码中多次使用这个神奇的数字。

    希望这有帮助!