Comment puis-je gérer cette erreur sans créer de variable supplémentaire?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Je ne veux pas créer de variable supplémentaire juste pour stocker la valeur de x. Est-il même possible de faire ce que je veux?
swift
syntax
immutability
mutability
Gabriel
la source
la source
Réponses:
Comme indiqué dans d'autres réponses, à partir de Swift 3, placer var avant une variable est obsolète. Bien que cela ne soit pas indiqué dans d'autres réponses, la possibilité de déclarer un
inout
paramètre. Pensez: en passant un pointeur.Cela peut être particulièrement utile en récursivité.
Les
inout
directives de déclaration d'Apple sont disponibles ici .la source
inout
Le mot-clé doit être placé entre le nom du paramètre et le type de paramètre comme ceci:func reduceToZero(x: inout Int)
dans la version actuelle de Swift 3.Les paramètres 'var' sont obsolètes et seront supprimés dans Swift 3. Ainsi, l'assignation à un nouveau paramètre semble être la meilleure façon maintenant:
comme mentionné ici: les paramètres 'var' sont obsolètes et seront supprimés dans Swift 3
la source
x
dans le nouveauvar x
? Ou Swift fait-il quelque chose de plus efficace que cela?x
s'inscrit dans le registre), il n'y a pratiquement aucun coût. Si unx
tableau, une structure ou un objet est muté, alors une copie doit presque certainement être effectuée (à moins que l'optimiseur ne puisse l'analyser en ligne et l'aliaser).var
arguments que l'utilisationinout
qui peut avoir des effets secondaires involontaires, en particulier. si le var était un pointeur.Pour Swift 1 et 2 (pour Swift 3 voir la réponse par achi en utilisant un paramètre inout): l'argument d'une fonction dans Swift est
let
par défaut, alors changez-le envar
si vous devez modifier la valeur, c'est-à-dire,la source
var
est également très probable que les paramètres disparaissent dans les nouvelles versions de Swift par github.com/apple/swift-evolution/blob/master/proposalsRéponse Swift3 pour passer le pointeur de tableau mutable.
Fonction:
Appel à fonction:
la source
Dans Swift, vous ajoutez simplement le
var
mot - clé avant le nom de la variable dans la déclaration de fonction:Reportez-vous à la sous-section «Paramètres constants et variables» du chapitre «Fonctions» du livre Swift (page 210 de l'iBook tel qu'il est aujourd'hui).
la source
Il y a des cas où nous n'avons pas besoin d'utiliser
inout
Nous pouvons utiliser quelque chose comme ceci si vous voulez que les changements / la portée soient uniquement à l'intérieur de la fonction:
la source
Solution utilisant Swift5 avec programmation fonctionnelle ...
la source