Initialisation des propriétés Swift qui requièrent "self" comme argument

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 .

  • Vous devez accéder à self depuis init , avant que le timer soit initialisé.
  • Sinon, 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 } }