【问题标题】:Why the fatal error: Array index out of range show when print array in Swift?为什么致命错误:在 Swift 中打印数组时显示数组索引超出范围?
【发布时间】:2016-04-19 12:12:13
【问题描述】:

我是 Swift 的新手。我创建了一个 node swift 文件来存储节点信息。而另一个 group swift 文件是一个存储所有节点的组。

Node.swift的代码如下:

class Node {

    var id:UInt8=0
    var type:Int=0
    var name:String=""
    var bdAddr:NSUUID!

    //The node private packet counter
    var nodePktNum:Int=0
}

Group.swift的代码如下:

class Group {

    var mLedDevice:[LedDevice]? = [LedDevice]()

    class LedDevice {
        var node            :Node?
        var rssi            :Int?
    }

    func allocateNode()
    {
        print("mLedDevice![0].node = \(mLedDevice![0].node))")
    }

}

当我尝试调用函数 (allocateNode) 并尝试通过 print("mLedDevice![0].node = \(mLedDevice![0].node))") 打印 mLedDevice![0].node)

它显示错误fatal error: Array index out of range

我是否遗漏了一些初始化 var mLedDevice:[LedDevice]? = [LedDevice]() 的内容?

提前致谢。

====================================编辑=========== =======================

我想将项目添加到数组中,所以我创建了一个像 let let leddevice : LedDevice 这样的参数,并尝试给它一些值。并将 leddevice 添加到array mLedDevice。但它显示 constant 'leddevice' used before being initialized

如何给出let leddevice : LedDevice 的初始值?

func allocateNode()
{
  let leddevice : LedDevice
  leddevice.node?.id = UInt8(0)
  leddevice.node!.bdAddr = NodeUUID
  mLedDevice?.append(leddevice)
}

【问题讨论】:

  • 您是否将任何 LedDevice 对象添加到数组中。您创建了数组,但之后它是空的,然后您尝试访问不存在的第一个元素(mLedDevice![0]),这会产生错误
  • 你的数组是空的,allocateNode()应该先将节点添加到数组中,然后打印出来
  • 请阅读 Swift 语言指南中关于初始化的章节

标签: swift


【解决方案1】:

我能想到的唯一可能导致这种情况的事情是数组为空,即您正试图访问该数组的索引 0,但该索引不存在。

试试下面的方法,在看到数组的内容后,它可能会让你对如何解决它有所了解:

print("mLedDevice = \(mLedDevice))")

换句话说,您正在实例化一个没有元素的数组。

【讨论】:

  • 谢谢!但是当我尝试将项目添加到数组中时,我遇到了新问题。它显示在初始化之前使用的常量“leddevice”......如何给它一个初始化值? LedDevice类型中有很多参数...
  • @Martin 尝试使用 var 而不是 let。这有帮助吗?
  • @Martin 向我们展示了您为其赋予价值的代码......它可能会进一步帮助
【解决方案2】:

在你的代码行中

var mLedDevice:[LedDevice]? = [LedDevice]()

您只是在初始化一个空数组。之后您尝试的是访问第一个元素,空数组,这是超出范围的。

在打印语句之前,您需要向数组中添加一个项目

var ledDevice = LedDevice()
mLedDevice.append(ledDevice)

然后你的打印语句不会给你任何错误。

更新:添加问题的答案

let leddevice : LedDevice 定义了一个LedDevice 类型的常量,但尚未初始化,然后在下一行代码中使用它。您应该将其替换为

let leddevice = LedDevice()

这也将初始化变量。

注意:如果您还有其他问题,您应该为此写一个新问题。
注意2:您是否阅读过任何关于初始化的guides

【讨论】:

  • 谢谢!但是当我尝试将项目添加到数组中时,我遇到了新问题。它显示在初始化之前使用的常量“leddevice”......如何给它一个初始化值? LedDevice类型中有很多参数...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多