Задан массив из n элементов, т.е.
var array = [1, 2, 3, 4, 5]
Я могу написать расширение для Array
чтобы изменить массив для получения такого результата: [2, 3, 4, 5, 1]
:
mutating func shiftRight() {
append(removeFirst())
}
Есть ли способ реализовать такую функцию, которая бы сдвигала массив на любой индекс, положительный или отрицательный. Я могу реализовать эту функцию в императивном стиле с помощью предложений if-else
, но я ищу функциональную реализацию.
Алгоритм прост:
- Разбить массив на две части по предоставленному индексу
- добавить первый массив в конец второго
Есть ли способ реализовать его в функциональном стиле?
Код, с которым я закончил:
extension Array {
mutating func shift(var amount: Int) {
guard -count...count ~= amount else { return }
if amount < 0 { amount += count }
self = Array(self[amount ..< count] + self[0 ..< amount])
}
}