2015-04-03 4 views
5

Когда я фильтрую массив в Swift, могу ли я ожидать, что результаты будут в том же порядке, что и оригинал? Например, я могу рассчитывать на:Является ли метод фильтра Swift стабильным?

[3, 1, 4, 1, 5, 9, 2, 7].filter{$0 > 4} 

всегда возвращаются:

[5, 9, 7] 

?

+0

Да. Он вернет то же самое. – anasimtiaz

+0

Предположим, что это не так. Что еще вы ожидаете получить от '$ 0> 4'? –

+0

@LeoNatan, он может вернуться '[9, 5, 7]'. Я задал вопрос, потому что мой код должен всегда возвращать '[5, 9, 7]', и я не знаю, писать ли для этого проверки. – user3770280

ответ

8

Да, вы можете рассчитывать на это. Метод filter экземпляра массива вызывает глобальный filter метод, чей комментарий в файле Swift заголовка прямо говорит:

Вернуть Array, содержащий элементы source, в порядке, которые удовлетворяют предикат

(курсив мой).

Кроме того, вся суть этих методов на массив, таких как map и filter (и, в этом отношении, reduce) является то, что массив заказал и они цикл через массив в указанном порядке. Массив является последовательность (а SequenceType): он имеет генератор с next() метод, который вызывается многократно для того, чтобы цикл через массив , чтобы, и это next() метод является как такие методы сделать цикл через массив.

3

Хотя это не упоминается, представляется, что это имеет место в соответствии с examples in the documentation

let array = [0, 1, 2, 3, 4, 5, 6, 7] 
let filteredArray = array.filter { $0 % 2 == 0 } 
// filteredArray is [0, 2, 4, 6] 

массива манипуляции методы имеют тенденцию поддерживать порядок по всем направлениям, когда это имеет смысл, и это делает здесь. Я был бы очень удивлен, если бы он не вернулся в том же порядке. Но еще раз, поскольку это явно не упоминается, может быть хорошей идеей написать чек в форме утверждения в случае, если они изменят его по строке.

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