web-dev-qa-db-fra.com

Swift 4.2 Setter Getter, tous les chemins de cette fonction s'appelleront

Avec Swift 4.2, j'ai commencé à voir beaucoup de problèmes, et l'un d'eux, je ne sais pas trop comment le résoudre, car ma méthode de lecture devrait renvoyer la valeur elle-même.

J'imagine que ce qui se passe, c'est que le getter va tenter d'accéder au getter lorsqu'il appelle self.type

Comment puis-je résoudre ce problème?

Voici une capture d'écran du code avec l'erreur.

enter image description here

Merci d'avance

Voici le code écrit

@objc var type: DecisionType {
    set {
        if(newValue == DecisionType.DecisionDouble){
            //Yes button and NO button should be showing
            okButton.isHidden = true;
            yesButton.isHidden = false;
            noButton.isHidden = false;
        }
        else {
            //Only Ok button should be showing
            okButton.isHidden = false;
            yesButton.isHidden = true;
            noButton.isHidden = true;
        }
    }
    get {
        return self.type;
    }
};
12
Travis Delly

Votre problème est qu’il n’ya pas de propriété stockée type à renvoyer par le getter. type est une propriété calculée. Lorsque vous essayez de lire sa valeur, il appelle le getter que vous avez défini. Ce getter appelle le getter, qui à son tour appelle le getter qui appelle le getter ... et ainsi de suite. Vous avez une récursion infinie.

Très probablement, ce que vous vouliez faire, c'est avoir une propriété stockée, qui a juste un comportement sophistiqué à chaque fois qu'elle est définie. Plutôt que d'utiliser une propriété calculée avec un get et set personnalisés, utilisez une propriété stockée avec un bloc willSet ou didSet:

@objc var type: DecisionType {
    didSet {
        let isDecisionDouble = newValue == DecisionType.DecisionDouble

        okButton.isHidden = isDecisionDouble;
        yesButton.isHidden = !isDecisionDouble;
        noButton.isHidden = !isDecisionDouble;
    }
}
15
Alexander