web-dev-qa-db-fra.com

Swift rendre le paramètre de la méthode mutable?)

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?

99
Gabriel

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 .

159
achi

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
}
44
LML

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

37
GeRyCh

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)
12
joshd

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)).

7
DK_

Solution utilisant Swift3 avec programmation fonctionnelle ...

func reduceToZeroFP(x:Int) -> Int {
    while (x > 0) {
        return reduceToZeroFP(x: x-1)
    }
    return x
}
0
Jules Burt

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
    // ...
}
0
dheeru