2016-03-14 3 views

ответ

6

Традиционный

var filteredArray = [] 
for var i = 1; i < stringArray.count; i = i + 2 { 
    filteredArray.append(stringArray[i]) 
} 

Функциональная альтернатива

var result = stringArray.enumerate().filter({ index, _ in 
    index % 2 != 0 
}).map { $0.1 } 

enumerate принимает массив элементов и возвращает массив кортежей, где каждый кортеж является пара индекс-массива (например, (.0 3, .1 "d")) , Затем мы удаляем элементы, которые нечетны, используя оператор модуля. Наконец, мы преобразуем массив кортежей обратно в обычный массив, используя map. НТН

+1

Спасибо! Я узнал перечисление(). –

12

Вместо того, чтобы использовать C-стиль для-петли (которые устанавливаются устареет в следующей версии Swift) вы могли бы сделать это, используя шаги:

var result = [String]() 
for i in 1.stride(to: stringArray.count, by: 2) { 
    result.append(stringArray[i]) 
} 

Или для еще более функциональное решение ,

let result = 1.stride(to: stringArray.count, by: 2).map { stringArray[$0] } 
2

есть куча разных способов сделать это, но вот пара, что я нашел интересный:

Использование flatMap() O п indices:

let result: [String] = stringArray.indices.flatMap { 
    if $0 % 2 != 0 { return stringArray[$0] } 
    else { return nil } 
} 

Примечание:result должен быть определен как [String] иначе компилятор не знает, какая версия flatMap() использовать.

Или, если вы хотите изменить исходный массив на месте:

stringArray.indices.reverse().forEach { 
    if $0 % 2 == 0 { stringArray.removeAtIndex($0) } 
} 

В этом случае вы должны позвонить reverse() на indices первый, так что они перечислены в обратном порядке. В противном случае к тому моменту, когда вы дойдете до конца массива, вы попытаетесь удалить индекс, который больше не существует.

+0

Обратите внимание, что удаление по индексу действительно дорого при удалении по всему массиву, как это. – Alexander

Смежные вопросы