我正在尝试创建Array
的子类(ok,Array
是struct
,所以我不能这样做,但请耐心等待)。 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
我希望数组的行为正常。如果执行了map
或filter
等操作,它只会在实际元素上按预期执行。
答案 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
基本操作创建包装方法。