Swift - 结构的动态数组

Posted

技术标签:

【中文标题】Swift - 结构的动态数组【英文标题】:Swift - Dynamic Array of Struct 【发布时间】:2018-10-23 16:39:24 【问题描述】:

我有一个结构:

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 时,我都会收到错误:

致命错误:索引超出范围

如何在 swift 中声明和初始化一个动态结构数组?

【问题讨论】:

不相关,但如果向Deque 添加一个采用初始值数组的初始化程序,您将获得更好的清晰度和性能。这将特别有用,因为它允许您在这些范围内使用 map 调用来初始化 Deque 【参考方案1】:
var burst = [Deque<Int>()]

这将 burst 声明为 1 Deque 对象的数组。您正在尝试访问burst[i],其中i 大于0,超出burst 范围。

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

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

【讨论】:

【参考方案2】:

您正在使用此命令在“burst”数组中仅创建一个“Deque”类型的元素:

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

这就是为什么当您尝试访问 i > 0 的“burst”数组时,它会崩溃。 您需要在追加到数组之前初始化一个新的 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)
    
  

【讨论】:

以上是关于Swift - 结构的动态数组的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 中对动态键和动态对象使用 Codable

Swift - 动态数组和改变视图

根据属性的动态列表对 Swift 数组进行排序

如何使用 Swift 动态访问数组中的项目

IOS - 如何在 Swift 3 中从 JSON 中捕获动态数组维度

创建结构元素的动态数组,然后创建结构的动态数组。 C++