gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:08:19 26 4
gpt4 key购买 nike

我正在尝试快速创建一个 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 实现的每个协议(protocol),并将关联的函数传递给数组?像这样:

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...

要完成如此简单的事情,这似乎是很多的工作。我错过了什么?

最佳答案

其实并没有看起来那么糟糕,因为很多协议(protocol)要求都有默认实现。不幸的是,我没有找到“最小”实现的完美方法。

  • 一些信息可以在 RandomAccessCollection documentation其中一些方法被标记为“必需。提供了默认实现。”

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

  • 在 Xcode 编辑器中使用“跳转到定义”可以检查协议(protocol)定义和扩展方法。

在你的情况下,事实证明它足以实现startIndexendIndex下标:

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
}
}

关于arrays - 在 Swift 中创建一个 FIFO 固定大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47540405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com