最简洁的方法来包装数组索引?

时间:2017-07-30 07:50:43

标签: ios arrays swift

说我有5个Ints的数组。如果索引递增或递减(例如)以下情况,包装数组索引的最有效方法是什么?

其中n = 0:arr[n-1] // - > arr[4](从0回到数组的末尾)

其中n = 2:arr[n+1] // - > arr[3](表现正常)

其中n = 4:arr[n+1] // - > arr[0](从数组末尾包装为0)

2 个答案:

答案 0 :(得分:2)

您可以使用mod操作来获取计数的-count范围,然后重新计算并重新计数:

let foo = [0, 1, 2, 3, 4, 5]

for i in -6...7 {
  print(i, foo[(i % foo.count + foo.count) % foo.count])
}

//  -6 0
//  -5 1
//  -4 2
//  -3 3
//  -2 4
//  -1 5
//  0 0
//  1 1
//  2 2
//  3 3
//  4 4
//  5 5
//  6 0

这适用于两个方向。

答案 1 :(得分:0)

晚了一点,但是如果您遇到相同的问题,并且有很多环绕数组索引的用例,则也可以将接受的答案中的%解决方案放入Array的简单下标扩展,例如:

extension Array {
    subscript (wrapping index: Int) -> Element {
        return self[(index % self.count + self.count) % self.count]
    }
}

示例用法:

let array = ["a","b","c"]
print( array[wrapping: 0] )   // a
print( array[wrapping: 4] )   // b
print( array[wrapping: -1] )  // c