J'ai une class Swift que je voudrais ressembler à ceci:
class UpdateManager { let timer: NSTimer init() { timer = NSTimer(timeInterval: 600, target: self, selector: "check", userInfo: nil, repeats: true) } func check() { // Do some stuff } }
Cependant, Swift n'aime pas le fait que je passe le self
à l'initialiseur NSTimer
. Est-ce que je brise un motif ici? Comment est-on censé accomplir l'initialisation comme ceci?
Vous avez trouvé le cas d'utilisation principal de Implicitly Unwrapped Optional .
self
depuis init
, avant que le timer
soit initialisé. timer
ne devrait jamais être nul, donc vous ne devriez pas avoir à le vérifier en dehors d' init
. Donc, vous devriez déclarer let timer: NSTimer!
.
Il est possible que Swift 2 ait changé ce qui fonctionne. J'utilise du code comme celui-ci:
@objc class Test : NSObject { var timer : NSTimer! init text() { super.init() timer = NSTimer(timeInterval: 1.0, target: self, selector: "timerFired:", userInfo: nil, repeats: true) NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) } }
Nécessaire à la fois la déclaration @objc et la sous-class NSObject. Aussi timer doit être un var, ne pas laisser.
Mis à part l'option implicitement déballée, j'ai trouvé que pour que le code fonctionne, j'avais besoin de sous-classr NSObject et d'append aussi le timer à la boucle d'exécution en cours.
class UpdateManager:NSObject { let timer: NSTimer! override init() { super.init() timer = NSTimer(timeInterval: 600, target: self, selector: "check", userInfo: nil, repeats: true) NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode) } func check() { // Do some stuff } }
Code mis à jour sur la base de commentaires – merci à jtbandes et Caroline
class UpdateManager { let timer: NSTimer! init() { timer = NSTimer.scheduledTimerWithTimeInterval(600, target: self, selector: "check", userInfo: nil, repeats: true) } @objc func check() { // Do some stuff } }