2017-07-26 3 views
0

Apparemment Le Swift Standard Library affirme que:baisse de séquence (alors :) Est-ce que rien

drop (alors :)

Renvoie une sous en sautant des éléments tout prédicat renvoie vrai et le retour des éléments restants.

En utilisant la signature de la fonction:

func drop(while predicate: (Self.Element) throws -> Bool) rethrows -> Self.SubSequence 

Lorsque predicate est décrit comme:

Une fermeture qui prend un élément de la séquence comme argument et renvoie un Valeur booléenne indiquant si l'élément est une correspondance.

Mon problème est que, dans cette description le comportement suivant ne doit pas se produire:

let test = (0...3).drop { $0 > 1 } 
test.contains(0) // true 
test.contains(3) // true 

Répondre

1

Je ne comprends pas pourquoi vous ne comprenez pas ce comportement. La documentation est assez claire et correspond à la sortie.

La documentation indique que la méthode continuera à ignorer (laisser tomber) des éléments tant que le prédicat est vrai. C'est comme une boucle while:

// not real code, for demonstration purposes only 
while predicate(sequence.first) { 
    sequence.dropFirst() 
} 

Et la séquence restante est retournée. Pour la séquence 0...3, il s'agit essentiellement de [0, 1, 2]?

Le premier élément, 0, satisfait-il le prédicat $0 > 1? Non, donc la boucle while imaginaire se brise, rien n'est supprimé, donc la séquence d'origine est renvoyée.

Je pense que vous confondez ceci avec peut-être prefix?

Avec prefix, il continuera à ajouter des éléments à une séquence tant que le prédicat est vrai et retourner la séquence lorsque le prédicat devient faux.

let test = (0...3).prefix { $0 > 1 } 
test.contains(0) // false 
test.contains(3) // false 
+0

J'avais l'impression que la méthode laissait tomber des éléments lorsqu'elle itérait toute la séquence. Si c'était le cas, $ 0 se réfèrerait à l'élément courant (comme c'est le cas avec map, filter, reduce, etc.). Donc, alors que 'test.contains (0)' devrait être vrai, 'test.contains (3)' devrait être faux, non? –

+0

@BrandonBradley Je suppose que le docs n'est pas si clair ici. Quand je vois la signature de la méthode, je pense immédiatement à une boucle while qui laisse tomber le premier élément de la séquence alors que le prédicat est vrai. – Sweeper

+0

Ah, je vois maintenant pourquoi le paramètre du site d'appel est nommé while. La méthode a beaucoup plus de sens maintenant, merci. –

0

0 n'est pas supérieur à 1, donc drop finitions « tombée » immédiatement et retourne la séquence.

Peut-être que vous cherchez filter(_:) ou prefix(while:)

+0

La méthode ne parcourt donc pas toute la séquence? –