在Swift中创建一个固定大小的FIFO数组

4

我想在Swift中创建一个FIFO数组。我希望创建的东西能够像这样工作:

var Arr = FixedFIFOArray<Int>(maxSize:3)
Arr.append(1)  //Arr = [1]
Arr.append(2)  //Arr = [1,2]
Arr.append(3)  //Arr = [1,2,3]
Arr.append(4)  //Arr = [2,3,4] <- the max size is fixed to 3, so any
                                  additional values added remove old values

除了这种行为外,它应该像一个数组一样运作:允许切片、索引、在for循环中迭代等。

在任何其他语言中,这都是子类化的工作。我们没有改变太多,只是添加了一个初始化程序并修改了一两个函数。然而,在Swift中,我们无法对array进行子类化。那么最好的方法是什么?我需要实现array实现的每个协议,然后将相关函数传递给一个数组吗?类似于这样:

struct FixedFIFOArray<T> {
    var _maxSize: Int
    var _array: [T] = []

    init(maxSize: Int) {
        self._maxSize = maxSize
    }

}

extension FixedFIFOArray : Collection {
    //...
}

extension FixedFIFOArray : RandomAccessCollection {
    //...
}

extension FixedFIFOArray : Sequence {
    //...
}
// etc...

这似乎是做一件很简单的事情需要做很多工作。我错过了什么吗?


也许你可以写一个扩展程序,为数组定义不同的附加函数,比如appendFIFO(element:T,forSize:Int)。这取决于具体情况,但也许已经足够了。 - j0h4nn3s
我也考虑过相同的方法。您还需要一个函数来修剪数组,以仅保留最后 n 个项目。 - claude31
1
大多数协议方法都有默认实现。只需实现startIndex、endIndex和subscript即可。 - Martin R
1个回答

1
这并不像看起来的那么糟糕,因为许多协议要求都有默认实现。不幸的是,我没有找到一个“最小”实现的完美配方。
  • 一些信息可以在RandomAccessCollection文档中找到,其中一些方法被标记为“必需的。提供了默认实现。”

  • 您还可以从空实现extension FixedFIFOArray : RandomAccessCollection {}开始,然后研究错误消息或尝试Fix-its。

  • 使用Xcode编辑器中的“跳转到定义”,您可以检查协议定义和扩展方法。

在你的情况下,实现startIndexendIndexsubscript就足够了:

extension FixedFIFOArray : RandomAccessCollection {
    var startIndex: Int {
        return _array.startIndex
    }

    var endIndex: Int {
        return _array.endIndex
    }

    subscript(i: Int) -> T {
        return _array[i]
    }
}

或者,如果您需要一个可读写的下标:
    subscript(i: Int) -> T {
        get {
            return _array[i]
        }
        set {
            _array[i] = newValue
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接