2016-11-22 2 views
0

Когда я хочу пройти и удалить элемент или элементы из массива (когда выполняются определенные условия), я обычно повторяю назад в C-стиле для цикла и удаляю по индексу, избегая проблемы с изменением индексных номеров следующего обрабатываемого элемента или изменения размера списка, влияющего на то, сколько раз проходит цикл. Но C для цикла была удалена в Swift 3.безопасно удалять элемент, итерации назад в Swift 3

Вот мой Swift 2,3 код для инициализации цикла:

for (var i = allowedItems.count - 1; i > -1; i -= 1) 

Вот уродство, созданный преобразователем Swift 3:

for (i in ((-1 + 1)...allowedItems.count - 1).reversed()) 

Однако эта версия не компилируется. («Ожидаемый», «Разделитель» в операторе «in»).

Я упростить бит «-1 + 1» к нулю:

for (i in (0...allowedItems.count - 1).reversed()) 

Теперь ошибка «Ожидаемое выражение для последовательности для-каждого цикла».

Что такое безопасный и, мы надеемся, разумно элегантный способ итерации назад в Swift 3, в котором переменная индекса или счетчика доступна для использования при определении того, какой элемент следует удалить? Этот тип логики отображает несколько мест в моем коде, поэтому я хочу убедиться, что вы найдете лучшее решение.

Спасибо.

+1

Вы попробовали 'for (i, item) в allowedItems.enumerated(). Reverseed() {...}'? – dasblinkenlight

ответ

2

Использование stride:

for i in stride(from: allowedItems.count - 1, through: 0, by: -1) { 

} 
+0

Ответы от Code Different, matt и комментарий от dasblinkenlight кажутся жизнеспособными способами этого. Я поддержал их всех, но отметил это как ответ, потому что он удовлетворяет (по крайней мере, мне) критериями элегантности и легкости понимания. –

2

Что является безопасным и, надеюсь, достаточно элегантный способ итерация назад в Swift 3

встроенного в способ:

for i in (0 ..< allowedItems.count).reversed() 

элегантный way i s:

for i in allowedItems.count >>> 0 

(где >>> обычай оператор, который я определяю here).

2

Что является безопасным и, надеюсь, достаточно элегантный способом итерации отсталые в Swift 3, в котором индекс или переменный счетчика производятся для использования при определении которых элемента должен быть удален?

Это не дает ответа на вопрос технического характера, но, возможно, основная проблема XY: Рассматривали ли вы просто отфильтровать массив на основе критериев «при соблюдении определенных условий»?

func certainConditionsForKeepingAreMet(_ element: YourElementType) -> Bool { /* ... */ } 
allowedItems = allowedItems.filter(certainConditionsForKeepingAreMet) 

E.g.

var allowedItems = [1, 3 ,6, 2] 
func certainConditionsForKeepingAreMet(_ element: Int) -> Bool { return element < 3 } 
allowedItems = allowedItems.filter(certainConditionsForKeepingAreMet) 
print(allowedItems) // [1, 2] 

Если вы хотите удалить и использовать удаленные элементы (на лету), вы могли бы просто трубы элементы, которые должны быть удалены до некоторой функции «использовать этот элемент», в ход проверки условий для элементов.

func doSomethingWith(_ element: Int) { print("Removed", element) } 

func certainConditionsForKeepingAreMet(_ element: Int) -> Bool { 
    if element >= 3 { 
     doSomethingWith(element) 
     return false 
    } 
    return true 
} 

var allowedItems = [1, 3 ,6, 2] 
allowedItems = allowedItems.filter(certainConditionsForKeepingAreMet) 
/* Removed 3 
    Removed 6 */ 
print(allowedItems) // [1, 2] 
Смежные вопросы