5
votes

Y a-t-il une différence entre la fonction "mutating" et les paramètres "inout" dans Swift?

Selon la documentation de Swift, les mots-clés mutants et inout sont utilisés pour modifier les types de valeur à partir d'une fonction. Y a-t-il une différence entre "mutating" et "inout" et tout cas particulier où nous devons utiliser l'un ou l'autre.


0 commentaires

4 Réponses :


2
votes

Pour moi, je vois la différence juste aux endroits où ils sont utilisés.

Le paramètre marqué avec le mot-clé inout vous permet de transmettre votre valeur à n'importe quelle méthode similaire comme référence

extension Int {

    mutating func square() {
        self = self * self
    }

}

En revanche, la méthode marquée du mot-clé mutating est utilisée dans la portée du type et vous permet de changer la valeur elle-même à partir de cette méthode

func square(inout num: Int) { 
    num = num * num
}


0 commentaires

2
votes

Les méthodes d'instance des types de valeur ne peuvent pas modifier les propriétés du type de valeur (ou la valeur elle-même), à ​​moins qu'elles ne soient marquées comme mutant .

Les fonctions de tout type ne peuvent pas modifier leurs paramètres (et faire en sorte que le changement se propage en dehors de la fonction) à moins que ces paramètres ne soient marqués comme inout .

Ils font un travail similaire, mais dans des contextes différents.


0 commentaires

15
votes

mutating marque une méthode. inout marque un paramètre. Ce sont des choses complètement différentes.

Les méthodes marquées avec mutating peuvent muter self c'est-à-dire définir les propriétés de self , réaffecter self code> etc.

func f(_ x: inout Int) {
    x = 10
}

var a = 1
f(&a)
print(a) // 10

Les paramètres marqués avec inout deviennent essentiellement des variables var , par opposition à let constantes. Vous pouvez les modifier, et les modifications seront également reflétées du côté de l'appelant.

struct Foo {
    var foo: Int

    mutating func mutate() {
        foo += 1 // this is mutating self
    }
}


3 commentaires

Les paramètres marqués avec inout deviennent essentiellement des variables var, par opposition aux constantes let. - un peu en désaccord, car Swift avait l'habitude d'avoir var marque pour les paramètres de fonction, et c'était différent. Les paramètres avec var étaient autorisés à muter, mais tous les changements n'ont jamais quitté la portée de la fonction, les changements des paramètres inout ont été remis dans la variable passée dans fonction.


@ user28434 c'est pourquoi j'ai également écrit la phrase suivante.


Et j'ai cité une partie sur devenir essentiellement des variables var . Comme il y avait à la fois var et inout , et qu'il s'agissait de choses différentes, appeler l'un en utilisant le mot-clé d'un autre est déroutant.



1
votes

inout: - Cela signifie que la modification de la variable locale modifiera également les paramètres passés. Sans cela, les paramètres transmis resteront la même valeur.

mutation: -Les propriétés des types valeur ne peuvent pas être modifiées dans ses méthodes d'instance par défaut. Pour modifier les propriétés d'un type valeur, vous devez utiliser le mot-clé mutating dans la méthode d'instance.


0 commentaires