Lors du passage d'une classe ou d'un type primitif à une fonction, toute modification apportée à la fonction dans le paramètre sera répercutée à l'extérieur de la classe. C'est en gros la même chose qu'un paramètre inout
est supposé faire.
Qu'est-ce qu'un bon cas d'utilisation pour un paramètre inout?
inout
signifie que la modification de la variable locale modifiera également les paramètres transmis. Sans cela, les paramètres transmis resteront la même valeur. Essayez de penser au type de référence lorsque vous utilisez inout
et au type de valeur sans l’utiliser.
Par exemple:
import UIKit
var num1: Int = 1
var char1: Character = "a"
func changeNumber(var num: Int) {
num = 2
print(num) // 2
print(num1) // 1
}
changeNumber(num1)
func changeChar(inout char: Character) {
char = "b"
print(char) // b
print(char1) // b
}
changeChar(&char1)
Un bon cas d’utilisation sera la fonction swap
qui modifiera les paramètres transmis.
Swift 3+ Remarque: À partir de Swift 3 , le mot clé inout
doit venir après les deux points et avant le type. Par exemple, Swift 3+ nécessite maintenant func changeChar(char: inout Character)
.
Les paramètres de fonction sont des constantes par défaut. Tenter de modifier la valeur d'un paramètre de fonction à partir du corps de cette fonction entraîne une erreur lors de la compilation. Cela signifie que vous ne pouvez pas modifier la valeur d’un paramètre par erreur. Si vous souhaitez qu'une fonction modifie la valeur d'un paramètre et que ces modifications soient conservées une fois l'appel de la fonction terminé, définissez ce paramètre en tant que paramètre in-out.
le paramètre inout permet de modifier les données d'un paramètre de type valeur et de conserver les modifications après l'appel de la fonction.
lors de l'utilisation du paramètre inout Swift 4.0 Work
class ViewController: UIViewController {
var total:Int = 100
override func viewDidLoad() {
super.viewDidLoad()
self.paramTotal(total1: &total)
}
func paramTotal(total1 :inout Int) {
total1 = 111
print("Total1 ==> \(total1)")
print("Total ==> \(total)")
}
}
Fondamentalement, il est utile lorsque vous voulez jouer avec des adresses de variable très utiles dans les algorithmes de structure de données.
Si vous travaillez avec des classes, alors, comme vous le dites, vous pouvez modifier la classe car le paramètre est une référence à la classe. Mais cela ne fonctionnera pas si votre paramètre est un type valeur ( https://docs.Swift.org/Swift-book/LanguageGuide/Functions.html - Section des paramètres In-Out)
Voici un bon exemple d’utilisation d’inout (définition des mathématiques pour les points CGPoints):
func + (left: CGPoint, right: CGPoint) -> CGPoint {
return CGPoint(x: left.x + right.x, y: left.y + right.y)
}
func += (left: inout CGPoint, right: CGPoint) {
left = left + right
}