102 votes

Programmation rapide: getter / setter dans la propriété stockée

Comment puis-je remplacer le setter de la stockées propriété dans Swift?

En Obj-C, je peux remplacer son setter, mais Swift ne semble pas être heureux de lecture/définition utilisée pour stocker les biens.

Dire que j'ai un Card de la classe d'une propriété appelée rank. Je ne veux pas le client pour lui donner toute valeur non valide, par conséquent, en objective-C, je peux écraser setRank alors qu'il effectue une vérification supplémentaire. Mais willSet en Swift ne semble pas aider, car newValue est constante et il n'a pas de sens à attribuer rank car setter sera appelée dans une boucle.

107voto

Mihai Fratu Points 3033

D'accord. En parcourant la documentation d'Apple sur Swift, j'ai trouvé ceci :

Si vous attribuez une valeur à une propriété dans son propre observateur didSet, la nouvelle valeur que vous affectez remplacera celle qui vient d'être définie.

Donc tout ce que vous avez à faire est ceci:

 var rank: Int = 0 {
    didSet {
        // Say 1000 is not good for you and 999 is the maximum you want to be stored there
        if rank >= 1000  {
            rank = 999
        }
    }
}
 

35voto

Joseph Mark Points 2348

Vous ne pouvez pas remplacer get / set pour une propriété stockée, mais vous pouvez utiliser les observateurs de propriété willSet - didSet

 var totalSteps: Int = 0 {
willSet(newTotalSteps) {
    println("About to set totalSteps to \(newTotalSteps)")
}
didSet {
    if totalSteps > oldValue  {
        println("Added \(totalSteps - oldValue) steps")
    }
}
}
 

Les noms de paramètres par défaut sont newValue pour willSet et oldValue pour didSet , ou vous pouvez les nommer vous-même comme dans willSet(newTotalSteps) .

8voto

user3675131 Points 91

get et set sont pour les propriétés calculées (ils n'ont pas de magasin de sauvegarde). (À mon avis, le mot clé 'var' est déroutant ici)

  • willSet et didSet sont appelés pour une variable d'instance (utilisez didSet pour remplacer toute modification)
  • set et get sont purement pour les propriétés calculées

-8voto

Michael Rapadas Points 560

Exemple simplifié:

 class Shape {
    var sideLength: Double {
    get {
        return self.sideLength
    }
    set {
        // Implement the setter here.
        self.sideLength = newValue
    }
    }
}
 

Exemple complet

Découvrez perimeter dans cet exemple.

Extrait de: Apple Inc. "Le langage de programmation Swift." iBooks. https://itun.es/us/jEUH0.l

 class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }

    var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
    }

    override func simpleDescription() -> String {
        return "An equilateral triagle with sides of length \(sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength"
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X