[Résolu] Setter overridé qui appelle le setter sur la super classe...

PyrohPyroh Membre
septembre 2016 modifié dans API AppKit #1

Je me heurte à  un soucis un peu bizarre. ça se passe en Swift 3 avec une classe de cette sorte :



class RulesTableItem: NSObject {
let id: String
let url: URL
let icon: NSImage
let name: String
var behavior: Int {
didSet {
let info = StatusMenuController.behaviorDidChangeUserInfoConstructor(id: id, url: url, behavior: AppBehavior(rawValue: behavior + 1)!)
let not = Notification(name: Notification.Name.BehaviorDidChangeForApp, object: self, userInfo: info)
NotificationCenter.default.post(not)
}
}

init(id: String, url: URL, icon: NSImage, name: String, behavior: Int) {
self.id = id
self.url = url
self.icon = icon
self.name = name
self.behavior = behavior
}
}

Rien de bien sorcier. J'ai besoin d'enlever ce +1 que j'ajoute à  behavior mais tout en gardant le reste. Alors je me suis dit que j'allais faire ce genre de chose :



class RunningAppTableItem: RulesTableItem {
override var behavior: Int {
didSet {
let info = StatusMenuController.behaviorDidChangeUserInfoConstructor(id: id, url: url, behavior: AppBehavior(rawValue: behavior)!)
let not = Notification(name: Notification.Name.BehaviorDidChangeForApp, object: self, userInfo: info)
NotificationCenter.default.post(not)
}
}
}

Dans ce que je comprends et de ce que je connais du paradigme objet, à  partir du moment ou j'override quelque chose je dois explicitement faire un appel à  la super classe si je veux utiliser son implémentation.


 


Ben là  non :



6 Fluor 0x0000000100005060 RulesTableItem.behavior.didset + 254
7 Fluor 0x0000000100005030 RulesTableItem.behavior.setter + 36
8 Fluor 0x0000000100005d50 RunningAppTableItem.behavior.setter + 93
9 Fluor 0x0000000100005d10 @objc RunningAppTableItem.behavior.setter + 42

J'ai quand même cherché et je me suis rendu compte que sur SO plein de gens ont le même soucis. On va dire que c'est "normal"....


 


Je laisse quand meme le post si jamais quelqu'un cherche.


 


Réponses

  • Voilà  la solution que j'ai trouvé sur SO :



    class RulesTableItem: NSObject {
    let id: String
    let url: URL
    let icon: NSImage
    let name: String
    dynamic var behavior: Int {
    didSet {
    postChangeNotification()
    }
    }

    init(id: String, url: URL, icon: NSImage, name: String, behavior: Int) {
    self.id = id
    self.url = url
    self.icon = icon
    self.name = name
    self.behavior = behavior
    }

    fileprivate func postChangeNotification() {
    let info = StatusMenuController.behaviorDidChangeUserInfoConstructor(id: id, url: url, behavior: AppBehavior(rawValue: behavior + 1)!)
    let not = Notification(name: Notification.Name.BehaviorDidChangeForApp, object: self, userInfo: info)
    NotificationCenter.default.post(not)
    }
    }

    class RunningAppsTableItem: RulesTableItem {
    fileprivate override func postChangeNotification() {
    let info = StatusMenuController.behaviorDidChangeUserInfoConstructor(id: id, url: url, behavior: AppBehavior(rawValue: behavior)!)
    let not = Notification(name: Notification.Name.BehaviorDidChangeForApp, object: self, userInfo: info)
    NotificationCenter.default.post(not)
    }
    }
Connectez-vous ou Inscrivez-vous pour répondre.