Swift-结构的动态数组

时间:2018-10-23 16:39:24

标签: arrays swift swift-playground swift-structs

我有一个结构:

public struct Deque<T> {

    private var array = [T]()

    public var isEmpty: Bool {
        return array.isEmpty
    }

    public var count: Int {
        return array.count
    }

    public mutating func enqueue(_ element: T) { //inserts element at end
        array.append(element)
    }

    public mutating func enqueueFront(_ element: T) { //inserts element at beginning
        array.insert(element, at: 0)
    }
}

我这样声明结构:

var burst = [Deque<Int>()]

然后在for循环中这样初始化它:

for i in 0..<9 {
    for j in 0..<10{
    if processes[i][j] != 0{
        burst[i].enqueue(processes[i][j])
    }
  }
}

我能够成功初始化结构的索引0,但是,每当我到达索引1时,都会出现错误:

  

致命错误:索引超出范围

如何快速声明和初始化结构的动态数组?

2 个答案:

答案 0 :(得分:4)

var burst = [Deque<Int>()]

这声明burst 1 Deque对象的数组。您正在尝试访问burst[i]大于0(在i范围之外)的burst

您可以像这样使用数组init(repeating:count:)初始化程序(doc):

var burst = Array<Deque<Int>>(repeating: Dequeue<Int>(), count: 10)

答案 1 :(得分:3)

您将使用以下命令在“突发”数组中仅创建一个类型为“双端队列”的元素:

var burst = [Deque<Int>()]  //There is only one element inside the array

这就是为什么当您尝试使用i> 0访问“突发”数组时会崩溃的原因。 您需要在添加到数组之前初始化一个新的Deque对象,然后调用

burst[i]

以后

您可以这样做:

for i in 0..<9 {
  for j in 0..<10{
    if processes[i][j] != 0{
        var queue = Deque<Int>()
        queue.enqueue(processes[i][j])
        burst.append(queue)
    }
  }
}