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

时间:2017-11-28 20:30:30

标签: arrays swift

我正在尝试在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...

这似乎是一个非常简单的工作很多。我错过了什么?

1 个答案:

答案 0 :(得分:1)

它没有看起来那么糟糕,因为许多协议要求都有 默认实现。 不幸的是,我没有找到“最小”实现的完美配方。

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

  • 您也可以从空实现extension FixedFIFOArray : RandomAccessCollection {}开始,研究错误消息或尝试修复它。

  • 在Xcode编辑器中使用“Jump to Definiton”可以检查协议定义和扩展方法。

在你的情况下,它证明它足以实现 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
        }
    }