Je regarde les notes de Xcode 7.3 et je remarque ce problème.
Les opérateurs ++ et - sont obsolètes
Quelqu'un pourrait-il expliquer pourquoi il est obsolète? Et ai-je raison de dire que dans la nouvelle version de Xcode, vous allez maintenant utiliser à la place de ++
ceci x += 1
;
Exemple:
for var index = 0; index < 3; index += 1 {
print("index is \(index)")
}
++
et--
Réponses:
Une explication complète ici de Chris Lattner, le créateur de Swift. Je vais résumer les points:
x += 1
for i = 0; i < n; i++ { ... }
Swift a de meilleures alternatives, commefor i in 0..<n { ... }
(la boucle for de style C sort également )x - ++x
oufoo(++x, x++)
?Pour ceux qui sont intéressés (et pour éviter la pourriture des liens), les raisons de Lattner dans ses propres mots sont:
la source
++
n'existait pas dans les langages de style C, personne de sensé ne se pencherait sur la conception de Swift 3.0 et ne penserait qu'un++
opérateur y serait un bon ajout.Je me rends compte que ce commentaire ne répond pas à la question, mais il peut y avoir des gens à la recherche d'une solution pour faire fonctionner ces opérateurs et une telle solution peut être trouvée en bas. 😇
Je préfère personnellement
++
et les--
opérateurs. Je ne peux pas être d'accord avec l'opinion selon laquelle ils sont délicats ou difficiles à gérer. Une fois que le développeur a compris ce que font ces opérateurs (et que nous parlons de choses assez simples), le code doit être très clair.Dans l'explication des raisons pour lesquelles les opérateurs étaient obsolètes, il est mentionné que leur utilisation principale était dans le style C pour les boucles. Je ne sais pas pour les autres mais personnellement , je ne pas utiliser des boucles de style C du tout et il y a encore beaucoup d' autres endroits ou des situations où
++
ou l'--
opérateur est utile.Je voudrais également mentionner que
varName++
renvoie une valeur afin qu'elle puisse être utilisée dans lereturn
considérantvarName += 1
ne peut pas.Pour tous ceux qui souhaitent continuer à travailler avec ces opérateurs, voici la solution:
la source
return (x - 1)
pour les opérateurs postfix - à mon humble avis, il est plus propre de maintenir la sémantique qu'ils renvoient (une copie de) la valeur d'origine plutôt que ce que vous obtenez si vous le faitesx + 1 - 1
Int
que de cela, le résultat de(x + 1)
sera dépassé, ce qui interrompra l'exécution et neresult - 1
sera donc même pas exécuté. D'autres types de données, commeDouble
par exemple, se comportent différemment, je dois donc étudier cela.defer
pour cela.defer { x += 1 }; return x
Apple a supprimé
++
et simplifié les choses avec une autre méthode traditionnelle.Au lieu de
++
, vous devez écrire+=
.Exemple:
De même pour l'opérateur de décrémentation
--
, vous devez écrire-=
Exemple:
Pour les
for
boucles:Exemple d'incrément:
Au lieu de
Tu peux écrire:
Exemple de décrémentation:
Tu peux écrire:
J'espère que cela t'aides!
la source
+=
était là depuis le début.++i
et--i
?Chris Lattner est entré en guerre contre ++ et -. Il écrit: «Le code qui utilise réellement la valeur de résultat de ces opérateurs est souvent déroutant et subtil pour un lecteur / mainteneur de code. Ils encouragent un code "trop délicat" qui peut être mignon, mais difficile à comprendre ... Bien que Swift ait un ordre d'évaluation bien défini, tout code qui en dépendait (comme foo (++ a, a ++)) serait indésirable même s'il était bien défini… ceux-ci échouent à la métrique «si nous ne les avions pas déjà, les ajouterions-nous à Swift 3?» »
Apple voulait garder rapidement un langage clair, clair, non déroutant et direct. Et donc ils ont déprécié ++ et - mot-clé.
la source
...for i in 0.stride(to: 10, by: 2)...
ou...for i in (1...10).reverse()...
est propre?!Le
Fix-it feature
de Xcode donne une réponse claire à cela.Remplacer
++ increment operator
par d'anciensvalue += 1
(opérateur à main courte) et-- decrement operator
parvalue -= 1
la source
Pour Swift 4, vous pouvez restaurer les opérateurs
++
et en--
tant qu'extensions pourInt
et d'autres types. Voici un exemple:Il fonctionne de la même manière pour les autres types, tels que
UIInt
,Int8
,Float
,Double
, etc.Vous pouvez coller ces extensions dans un seul fichier dans votre répertoire racine, et elles seront disponibles pour une utilisation dans tous vos autres fichiers.
J'ai remarqué quelques votes négatifs pour ma réponse ici, presque dès que je l'ai publiée. Ce que je prends comme un désaccord philosophique, plutôt que comme une critique du fonctionnement de mon code. Cela fonctionne parfaitement, si vous le regardez dans une aire de jeux.
La raison pour laquelle j'ai publié cette réponse est que je ne suis pas d'accord pour rendre les langages de programmation informatique inutilement différents les uns des autres.
Le fait d'avoir beaucoup de similitudes entre les langues les rend plus faciles à apprendre et à passer d'une langue à une autre.
Les développeurs utilisent normalement plusieurs langages de programmation, plutôt qu'un seul. Et c'est un vrai problème de passer d'une langue à une autre, quand il n'y a pas de conventions ni de standardisation commune entre les langues.
Je pense qu'il ne devrait y avoir de différences de syntaxe entre les langues que dans la mesure où cela est nécessaire, et pas plus que cela.
la source
Voici une version générique d'une partie du code publié jusqu'à présent. Je voudrais exprimer les mêmes préoccupations que les autres: il est préférable de ne pas les utiliser dans Swift. Je conviens que cela pourrait être déroutant pour ceux qui liront votre code à l'avenir.
Cela peut également être écrit comme une extension sur le type numérique.
la source
@discardableResult
à chacune de ces fonctions pour faire taire l'avertissement concernant la valeur de retour étant inutilisée; sinon exactement ce que je cherchais.À partir de la documentation :
la source
C'est définitivement un inconvénient, non?
la source
Comme vous ne travaillez jamais vraiment avec des pointeurs dans Swift, il est plutôt logique de supprimer les opérateurs
++
et--
à mon avis. Cependant, si vous ne pouvez pas vivre sans, vous pouvez ajouter ces déclarations d'opérateur Swift 5+ à votre projet:la source
Dans Swift 4.1, cela pourrait être réalisé de cette manière:
Notez que malgré le fait que cette solution est similaire aux solutions précédentes de cet article, elles ne fonctionnent plus dans Swift 4.1 et cet exemple fonctionne. Notez également que quiconque ci-dessus mentionne que + = est un remplacement de ++ ne comprend tout simplement pas pleinement l'opérateur car ++ combiné à une affectation est en fait deux opérations, d'où un raccourci. Dans mon exemple:
var s = t++
fait deux choses: attribuer la valeur de t à s puis incrémenter t. Si le ++ vient avant, ce sont les deux mêmes opérations effectuées dans l'ordre inverse. À mon avis, le raisonnement d'Apple sur les raisons de supprimer cet opérateur (mentionné dans les réponses précédentes) n'est pas seulement un faux raisonnement, mais en outre, je pense que c'est un mensonge et la vraie raison est qu'ils n'ont pas pu obliger leur compilateur à le gérer. Cela leur a posé des problèmes dans les versions précédentes, alors ils ont abandonné. La logique de «l'opérateur trop compliqué à comprendre, donc supprimé» est évidemment un mensonge car Swift contient des opérateurs bien plus compliqués et beaucoup moins utiles qui n'ont pas été supprimés. En outre, la grande majorité des langages de programmation l'a. JavaScript, C, C #, Java, C ++ et bien d'autres. Les programmeurs l'utilisent avec plaisir. Pour qui il est trop difficile de comprendre cet opérateur,La stratégie derrière Swift est simple: Apple pense que le programmeur est stupide et doit donc être traité en conséquence.
La vérité est que Swift, lancé en septembre 2014, était censé être ailleurs maintenant. D'autres langues ont grandi beaucoup plus vite.
Je peux énumérer de nombreuses erreurs majeures dans le langage, des plus sérieuses: comme les tableaux collés par valeur et non par référence, aux ennuyeuses: les fonctions de paramètres variadiques ne peuvent pas accepter un tableau qui est l'idée même derrière. Je ne pense pas que les employés d'Apple soient même autorisés à regarder d'autres langages tels que Java, donc ils ne savent même pas qu'Apple est à des années-lumière. Apple aurait pu adopter Java comme langage mais de nos jours, le défi n'est pas la technologie, mais l'ego l'est. S'ils avaient ouvert IntelliJ pour écrire un peu de Java, ils fermeraient à coup sûr leur entreprise en sachant qu'à ce stade, ils ne peuvent et ne rattraperont jamais.
la source