Inverse Gamme en Swift
Est-il un moyen de travailler avec revers gammes de Swift?
Par exemple:
for i in 5...1 {
//do something
}
est une boucle infinie.
Je sais que je peux utiliser 1..5
au lieu de cela, calculer j = 6 - i
et l'utilisation j
que mon index. Je me demandais juste si il y avait quelque chose de plus lisible?
- Voir ma réponse pour une question similaire qui donne jusqu'à 8 façons de résoudre votre problème avec Swift 3.
Vous devez vous connecter pour publier un commentaire.
Mise à jour Pour la dernière version de Swift 3 (pas encore Swift 4)
Vous pouvez utiliser le
reversed()
méthode sur une gammeOu
stride(from:through:by:)
méthodestide(from:to:by:)
est similaire, mais exclut la dernière valeurMise à jour Pour la dernière version de Swift 2
Tout d'abord, les extensions de protocole changer la façon dont
reverse
est utilisé:for i in (1...5).reverse() { print(i) } //5 4 3 2 1
Foulée a été retravaillé dans Xcode 7 Beta 6. La nouvelle utilisation est:
Il travaille également pour
Doubles
:Méfiez-vous de la virgule flottante compare ici des limites.
Plus tôt modifier pour Swift 1.2: Comme de Xcode 6 Bêta 4, par et ReverseRange n'existent plus :[
Si vous êtes simplement à la recherche pour inverser une plage, la inverse fonction est tout ce dont vous avez besoin:
Posté par 0x7fffffff il y a un nouveau foulée construire qui peut être utilisé pour effectuer une itération et d'incrément par des entiers arbitraires. Apple a également déclaré qu'à virgule flottante de soutien est à venir.
Provenant de sa réponse:
(1...5).reverse()
(comme un appel de fonction), veuillez mettre à jour votre réponse. (Puisque c'est seulement deux personnages, je ne pouvais pas éditer ton post.)(1...5).reversed()
. Aussi, l'exemple de.stride()
ne fonctionne pas, et les besoins de la fonction librestride(from:to:by:)
à la place.stride
code swift 3 est légèrement incorrect. pour inclure le numéro 1, vous devez utiliserthrough
opposition àto
comme ceci:for i in stride(from:5,through:1,by:-1) { print(i) }
reversed
a une complexité de O(1) car il se contente de les roulés de la collection d'origine et ne nécessite pas une itération à construire.Il y a quelque chose de troublant à propos de l'asymétrie de cette:
...plutôt ceci:
Cela signifie que chaque fois que je veux faire une inversion de gamme, j'ai oublier de mettre les parenthèses, en plus je dois écrire que
.reverse()
sur la fin, qui sortait comme un pouce endolori. C'est vraiment laid en comparaison à C de style pour les boucles, qui sont symétriques à compter et le compte à rebours. J'ai donc tendance à utiliser de style C pour les boucles à la place. Mais dans Swift De 2,2, C-style de boucles qui s'en vont! J'ai donc eu à se précipiter autour de remplacer tous mes décrémentation de style C pour les boucles avec ce vilain.reverse()
, la construction me demandais tout le temps, pourquoi diable n'est-il pas inverser la gamme de l'opérateur?Mais attendez! C'est Swift — nous sommes permis de définir nos propres opérateurs!! Nous y voilà:
Alors maintenant, je suis autorisé à dire:
Ce couvre seulement le cas le plus fréquent qui se produit dans mon code, mais il est de loin le cas le plus courant, donc c'est tout ce que j'ai à l'heure actuelle.
J'ai eu une sorte de crise interne à venir avec l'opérateur. J'aurais bien aimé utiliser
>..
, comme étant l'inverse de..<
, mais ce n'est pas juridique: vous ne pouvez pas utiliser un point après un non-point, il semble. J'ai considéré..>
mais a décidé qu'il était trop difficile de distinguer les..<
. La bonne chose à propos>>>
est qu'il hurle à vous: "bas à!" (Bien sûr, vous êtes libre de venir avec un autre opérateur. Mais mon avis est: pour la super symétrie, de définir<<<
de faire ce..<
fait, et maintenant vous avez<<<
et>>>
qui sont symétriques et facile à saisir.)Swift 3 version (Xcode 8 graines 6):
Swift 4 version (Xcode 9 beta 3):
Swift version 4.2 (Xcode 10 beta 1):
Swift version 5 (Xcode 10.2.1):
>>>
opérateur est vraiment cool! J'espère Swift concepteurs prêter attention à des choses comme ça, parce que collerreverse()
sur la fin de la mise entre parenthèses des expressions ne se sent bizarre. Il n'y a pas de raison qu'ils ne pouvaient pas traiter avec des5>..0
varie automatiquement, parce queForwardIndexType
protocole prévoit parfaitement raisonnabledistanceTo()
opérateur qui peut être utilisé pour déterminer si la foulée doit être positif ou négatif.Il semble que les réponses à cette question ont un peu changé, comme nous l'avons progressé à travers les bêtas. Comme de la bêta 4, le
by()
de la fonction et de laReversedRange
type ont été retirés de la langue. Si vous cherchez à faire une inversion de la gamme, vos options sont maintenant comme suit:1: Créer un en avant de la gamme, et ensuite utiliser le
reverse()
fonction de l'inverser.2: Utilisation de la nouvelle
stride()
fonctions qui ont été ajoutées dans la version bêta 4, qui comprend des fonctions pour spécifier le début et la fin des index, ainsi que la quantité d'itérer par.Noter que j'ai aussi inclus la nouvelle gamme exclusive de l'exploitant dans ce post ainsi.
..
a été remplacé par..<
.Edit: De Xcode 6 beta 5 notes de version, Apple a ajouté la suggestion suivante pour la manipulation de ce:
Voici un exemple.
lazy(0....5).reverse()
et je ne vois pas la beta 5 notes de version. Connaissez-vous d'autres discussions sur ce sujet? Aussi, pour info, les chiffres à l'intérieur quefor
boucle sont à l'envers dans votre exemple.// 0, 1, 2, 3, 4, 5
mais en fait elle devrait être inversé. Le commentaire est trompeuse.Xcode 7, beta 2:
Swift 3, 4+: vous pouvez le faire comme ceci:
résultat: 10, 9, 8 ... 0
Vous pouvez le personnaliser comme vous le souhaitez. Pour plus d'informations, lisez
func séquence<T>
de référenceCela pourrait être une autre manière de faire.
Reverse() la fonction est utilisée pour inverser la le nombre.
Var n:Entier //Entrer le numéro de
For i in 1...n.reverse()
{
Print(i)
}