Comment puis-je traiter 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?
Comme indiqué dans d'autres réponses, à compter de Swift 3 placer var avant qu'une variable ne soit obsolète. Bien que cela ne soit pas indiqué dans les autres réponses, il est possible de déclarer un paramètre inout. Pensez: passer un pointeur.
func reduceToZero(_ x: inout Int) {
while (x != 0) {
x = x-1
}
}
var a = 3
reduceToZero(&a)
print(a) // will print '0'
Cela peut être particulièrement utile en récursivité.
Les directives de déclaration inout d’Apple sont disponibles ici .
Pour Swift 1 et 2 (pour Swift 3, voir réponse par achi à l'aide d'un paramètre inout): L'argument d'une fonction dans Swift est let
par défaut, remplacez-le par var
si vous devez modifier la valeur, c.-à-d.
func reduceToZero(var x:Int) -> Int {
while (x != 0) {
x = x-1
}
return x
}
Les paramètres 'var' sont obsolètes et seront supprimés dans Swift 3. Donc, l'assignation à un nouveau paramètre semble être la meilleure façon de procéder:
func reduceToZero(x:Int) -> Int {
var x = x
while (x != 0) {
x = x-1
}
return x
}
comme mentionné ici: les paramètres 'var' sont obsolètes et seront supprimés dans Swift
Swift3 répond pour passer un pointeur de tableau mutable.
Une fonction:
func foo(array: inout Array<Int>) {
array.append(1)
}
Appel à fonction:
var a = Array<Int>()
foo(array:&a)
Dans Swift, vous ajoutez simplement le mot clé var
avant le nom de la variable dans la déclaration de la fonction:
func reduceToZero(var x:Int) -> Int { // notice the "var" keyword
while (x != 0) {
x = x-1
}
return x
}
Reportez-vous à la sous-section "Paramètres constants et variables" dans le chapitre "Fonctions" du Swift (page 210 de l'iBook tel qu'il est aujourd'hui)).
Solution utilisant Swift3 avec programmation fonctionnelle ...
func reduceToZeroFP(x:Int) -> Int {
while (x > 0) {
return reduceToZeroFP(x: x-1)
}
return x
}
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 modifications/la portée soient uniquement à l'intérieur de la fonction:
func manipulateData(a: Int) -> Int {
var a = a
// ...
}