如何创建一个无限循环固定数量元素的数组

时间:2017-09-08 17:37:30

标签: arrays swift

我正在尝试创建Array的子类(ok,Arraystruct,所以我不能这样做,但请耐心等待)。 Array将具有有限数量的元素(如所有数组所做的那样),但是不可能返回out of range错误,因为模运算将应用于任何用于访问阵列。

let loopArray: LoopArray<Int> = [1, 2, 3, 4, 5]
print("Element at position 5 = \(loopArray[5])"

如果这是一个正常的数组,它会因超出范围的异常而崩溃。但由于它是一个循环数组,因此这里的输出将是

Element as position 5 = 1

我希望数组的行为正常。如果执行了mapfilter等操作,它只会在实际元素上按预期执行。

2 个答案:

答案 0 :(得分:3)

以下是执行此操作的扩展程序:

extension Array {
    subscript(loopingIndex loopingIndex: Int) -> Element {
        get { return self[loopingIndex % self.count] }
        set { self[loopingIndex % self.count] = newValue }
    }
}

使用示例:

let loopArray = [1, 2, 3]
loopArray[loopingIndex: 5]

由于Array是一个结构,因此创建与Array完全相同但只有subscript执行不同的全新类型的唯一方法是复制所有除Array之外的subscript中的代码。因此,我建议你写一个扩展名。但扩展的问题在于,必须使用带有参数标签的下标,因为Array中已经存在没有参数标签的下标。

答案 1 :(得分:1)

您可以通过创建一个包含struct成员的Array来实现此目的。然后创建访问方法以按照您想要的方式访问其元素。

看起来应该是这样的:

struct LoopArray {
    var array: [Int]

    init() {
        self.array = [Int]()
    }

    subscript(index:Int) -> Int {
        get {
            return self.array[index % self.array.count]
        }
    }
}

您需要为其他Array基本操作创建包装方法。