web-dev-qa-db-fra.com

Définir une valeur par défaut pour une propriété avec un getter et un setter définis

J'ai un cours très simple

class SimpleClass {
    var simpleDescription: String {
    get {
        return self.simpleDescription
    }
    set {
        self.simpleDescription = newValue
    }
    }
}

Quelle est la bonne façon de définir une valeur par défaut pour la variable simpleDescription?

19
JuJoDi

Dans Swift, les getters et les setters sont utilisés pour les propriétés calculées - il n'y a pas de stockage pour la propriété et, dans votre cas, simpleDescription ne peut pas être défini dans un setter.

Si vous avez besoin d'une valeur par défaut, utilisez:

class SimpleClass {
  var simpleDescription: String = "default description"
}

si vous voulez initialiser utiliser:

class SimpleClass {
  var simpleDescription: String
  init (desc: String) {
    simpleDescription = desc
  }
}
21
GoZoner

Si vous voulez exécuter une action à chaque fois qu'une variable est définie ou simplement vérifier si la valeur est correcte, vous pouvez utiliser Property Observers
De docs:

Les observateurs des biens observent et réagissent aux changements de la valeur d’un bien. Les observateurs de propriété sont appelés chaque fois qu'une valeur de propriété est définie, même si la nouvelle valeur est identique à la valeur actuelle de la propriété.

Vous pouvez les utiliser comme ceci:

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

MODIFIER 

On dirait que cela ne fonctionne pas lors de la substitution des propriétés héritées. Voici un exemple de ce que vous ne pouvez pas faire:

class StepWihtoutCounter {
    var totalSteps: Int = 0 
}

class StepCounter: StepWihtoutCounter {
    override var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
16
Mark E

La solution est facile. Utilisez simplement une autre variable, récupérez-la dans getter.

var _simpleDescription = "Default value"

var simpleDescription: String {
    get {
        return self._simpleDescription
    }
    set {
        self.simpleDescription = newValue
    }
}
1
Boomerange

Définir directement une valeur simple: 

var string1: String = "value" {
    willSet {
        print("willSet")
    }
    didSet {
        print("didSet")
    }
}

Paramétrer le résultat d'une fermeture calculée:

var string2: String = {
        return "value"
    }() {
    willSet {
        print("willSet")
    }
    didSet {
        print("didSet")
    }
}
0
pkamb