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.
4 Réponses :
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 }
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.
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 } }
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.
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.