我正在尝试在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...
这似乎是一个非常简单的工作很多。我错过了什么?
答案 0 :(得分:1)
它没有看起来那么糟糕,因为许多协议要求都有 默认实现。 不幸的是,我没有找到“最小”实现的完美配方。
有些信息可以在
RandomAccessCollection
documentation
其中一些方法标记为“必需。提供默认实现。”
您也可以从空实现extension FixedFIFOArray : RandomAccessCollection {}
开始,研究错误消息或尝试修复它。
在Xcode编辑器中使用“Jump to Definiton”可以检查协议定义和扩展方法。
在你的情况下,它证明它足以实现
startIndex
,endIndex
和subscript
:
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
}
}