Swift : bloquer la mise à jour d'un champ avec willSet ?

Bonjour à tous,

Est il possible de bloquer la mise à jour d'un champ avec un willSet ? Par exemple :

var myPropertyValue: Int = 0
var myProperty: Int {
    willSet {
        if newValue < myPropertyValue {
            // Alors je bloque
        }
    }
    get {
        return myPropertyValue
    }
    set {
        myPropertyValue = newValue
    }
}

Réponses

  • Non ça n'est pas possible normalement. Son objectif est juste d'informer quand la propriété va être modifié.

    Il faudrait plutôt avoir quelque chose comme ça:

    var testA: Int = 0 {
         willSet {
            if newValue > 10 {
                testB = newValue
            }
         }
    }
    var testB: Int = 0
    
  • PyrohPyroh Membre

    Non tu ne peux pas le faire comme ça. Par contre la solution n'est vraiment pas loin :

    var myPropertyValue: Int = 0
    var myProperty: Int {
        get {
            return myPropertyValue
        }
        set {
            if newValue < myPropertyValue {
                myPropertyValue = newValue
            }
        }
    }
    
  • Joanna CarterJoanna Carter Membre, Modérateur
    mars 2018 modifié #4

    @Pyroh a dit :
    Non tu ne peux pas le faire comme ça. Par contre la solution n'est vraiment pas loin :

    var myPropertyValue: Int = 0
    var myProperty: Int {
        get {
            return myPropertyValue
        }
        set {
            if newValue < myPropertyValue {
                myPropertyValue = newValue
            }
        }
    }
    

    Juste un peu plus correct…

    private var _myProperty: Int = 0
    
    public var myProperty: Int
    {
      get
      {
        return _myProperty
      }
      set
      {
        if newValue >= myProperty
        {
          _myProperty = newValue
        }
      }
    }
    

    B)

  • Je viens de me rendre compte que c'est plus la structure ci dessous qui intéresse mais ça ne change en rien le problème.

    var myProperty = 0 {
        willSet {
            if newValue < self.myProperty {
                // Alors je bloque
            }
        }
        didSet {
            .....
        }
    }
    
  • Joanna CarterJoanna Carter Membre, Modérateur
    mars 2018 modifié #6

    Pour ce que tu veux faire, tu ne peux pas utiliser willSet et didSet. Tu ne peux pas empêcher le "set" sauf si tu utilises ce que j'ai écrit.

    willSet et didSet sont là seulement pour les notifications, pas pour la modification du fil d'exécution

  • Okay, merci bien ! :)

  • PyrohPyroh Membre

    @Joanna Carter a dit :

    @Pyroh a dit :
    Non tu ne peux pas le faire comme ça. Par contre la solution n'est vraiment pas loin :

    var myPropertyValue: Int = 0
    var myProperty: Int {
        get {
            return myPropertyValue
        }
        set {
            if newValue < myPropertyValue {
                myPropertyValue = newValue
            }
        }
    }
    

    Juste un peu plus correct…

    private var _myProperty: Int = 0
    
    public var myProperty: Int
    {
      get
      {
        return _myProperty
      }
      set
      {
        if newValue >= myProperty
        {
          _myProperty = newValue
        }
      }
    }
    

    B)

    Ne démarrons pas une guerre que nous ne pouvons terminer 😉

  • Joanna CarterJoanna Carter Membre, Modérateur
    > @Pyroh a dit
    > Ne démarrons pas une guerre que nous ne pouvons terminer 😉

    B)
  • 🐻⚔️ 🎀💣

  • JérémyJérémy Membre
    mars 2018 modifié #11

    Dommage, ce sont les débats "animés" qui sont les plus intéressants. :#

Connectez-vous ou Inscrivez-vous pour répondre.