2D数组:索引超出范围

时间:2017-02-23 18:52:07

标签: arrays swift multidimensional-array

我对Swift很陌生,我试图将我的数据存储为2D AnyObject数组。我已声明var internalData = [[AnyObject]]()和结构如此:

struct WiFiData {
    var latency: Double
    var duration: Double
}

现在,在另一个函数中,我想打开实例变量currentExit,这是一个枚举:

private var currentExit = Exit.A

enum Exit {
    case A
    case B
    case C
    case NotSelected
}

func someFunc() {
    switch self.currentExit {
    case .A:
    self.internalData[0].append(WiFiData(latency: 1.5, duration: 4.0) as AnyObject) // <- CRASHES ON THIS LINE
    ......// other cases
}

但是,它总是在self.internalData[0].append(WiFiData(latency: 1.5, duration: 4.0) as AnyObject)行崩溃,并出现以下错误:

  

致命错误:索引超出范围

谁能告诉我为什么以及如何解决这个问题?感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

没有&#34; 2D阵列&#34;在斯威夫特。有阵列阵列,它们是不同的。例如,没有承诺每行在数组数组中具有相同数量的列。

在您的情况下,问题是internalData中没有元素。必须先创建一个internalData[0]元素,然后才能追加它。您var internalData = [[AnyObject]]()的分配意味着没有元素0.它是一个空数组(数组)。

另请注意,[[AnyObject]]类型很可能会给您带来很多问题。 AnyObject对于使用Cocoa API非常有用,但通常会产生很多麻烦,很少会成为Swift属性的一部分。您几乎肯定会创建一些更具体的类型来保存您的数据。从您的示例中不清楚您期望internalData持有什么。但是,您的代码表明,您的意思更像是:

var internalData: [Exit: [ExitRecord]] = [:]

enum Exit {
    case A
    case B
    case C
    case NotSelected
}

enum ExitRecord {
    case wifi(latency: Float, duration: Float)
}

func someFunc() {
    switch self.currentExit {
    case .A:
        var currentRecords = internalData[.A] ?? []
        currentRecords.append(.wifi(latency: 1.5, duration: 4.0))
        internalData[.A] = currentRecords
    ......// other cases
}

答案 1 :(得分:2)

您使用[[AnyObject]]()实例化了一个二维数组,但它仍然是空的,这意味着self.internalData[0]没有任何内容可供您追加。你可以做很多事情来解决这个问题,但是如果你知道你在self.internalData内有3个数组,你可以像这样实例化每个内部数组:

self.internalData = [[AnyObject](), [AnyObject](), [AnyObject]()]

现在,self.internalData[0]处有一个空数组,您可以将项目附加到。

但是,似乎如果你已经知道你将拥有3个WiFiData数组,那么创建3个变量会更好:

var a = [WiFiData]()
var b = [WiFiData]()
etc.

然后您可以按名称访问各个数组。