web-dev-qa-db-fra.com

Swift - Setter personnalisé sur la propriété

Je convertis un projet en Swift et j'ai rencontré un problème dans un setter. Mon code Objective-C ressemblait à ceci:

- (void)setDocument:(MyDocument *)document
{
    if (![_document isEqual:document]) {
        _document = document;

        [self useDocument];
    }
}

et a permis à mon View Controller de l'exécuter à chaque fois que le document était défini (généralement dans le prepareForSegue: méthode du View Controller présentateur).

J'ai trouvé les observateurs de propriétés willSet et didSet mais ils ne fonctionnent que lorsque la propriété est mise à jour, pas lorsqu'elle est initialisée et mise à jour.

Des idées? Merci

MISE À JOUR

après avoir essayé d'obtenir {} et de définir {}, j'obtiens le EXC_BAD_ACCESS Erreur

var document: UIDocument? {
    get {
        return self.document!
    }
    set {
        self.document = newValue

        useDocument()
    }
}
21
Adam Carter

Vous ne pouvez pas utiliser set comme ça parce que lorsque vous appelez self.document = newValue vous appelez à nouveau le passeur; vous avez créé une boucle infinie.

À la place, vous devez créer une propriété distincte pour stocker réellement la valeur dans:

private var _document: UIDocument? = nil
var document: UIDocument? {
    get {
        return self._document
    }
    set {
        self._document = newValue
        useDocument()
    }
}
47
Mike S

Voici une version Swift 3

var document : UIDocument? {
    didSet {
        useDocument()
    }
}
8
John Stephen