2015-04-03 10 views
5

Wenn ich ein Array in Swift filter, kann ich erwarten, dass die Ergebnisse in der gleichen Reihenfolge wie das Original sind? Zum Beispiel kann ich zählen:Ist Swifts Filtermethode stabil?

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

immer Rückkehr:

[5, 9, 7] 

?

+0

Ja. Es wird dasselbe zurückgeben. – anasimtiaz

+0

Nehmen wir an, es ist nicht. Was würden Sie sonst von '$ 0> 4' erwarten? –

+0

@LeoNatan, es könnte '[9, 5, 7]' zurückgeben. Ich habe die Frage gestellt, weil mein Code es immer benötigt, um "[5, 9, 7]" zurückzugeben, und ich weiß nicht, ob ich dafür Schecks schreiben soll. – user3770280

Antwort

8

Ja, Sie können sich darauf verlassen. Die filter Instanzmethode von Array ruft die globale filter Methode, deren Kommentar in der Swift-Header-Datei explizit sagt:

Return ein Array die Elemente source, um, enthält, die das Prädikat

erfüllen

(meine Kursivschrift).

Darüber hinaus ist der springende Punkt dieser Methoden auf Array wie map und filter (und, was das betrifft, reduce) ist, dass ein Array geordnete ist, und sie durchlaufen die Anordnung in dieser Reihenfolge . Ein Array ist eine Sequenz (a SequenceType): es ist einen Generator mit einer next() Methode hat, die wiederholt, um, um durch das Array um, und diese next() Methode aufgerufen wird, wie solche Verfahren Zyklus tun durch das Array.

3

Es ist zwar nicht ausdrücklich erwähnt wird, scheint es, dass das der Fall nach ist der 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] 

Array Manipulationsmethoden sind in der Regel, um auf der ganzen Linie zu halten, wenn es Sinn macht, und es tut hier. Ich wäre sehr überrascht, wenn es nicht in der gleichen Reihenfolge zurückkommen würde. Aber noch einmal, da es nicht explizit erwähnt wird, kann es eine gute Idee sein, einen Scheck in Form eines Assert zu schreiben, falls sie ihn auf der ganzen Linie ändern.