初始化需要“self”作为参数的Swift属性

我有一个Swift类,我想看起来像这样:

class UpdateManager { let timer: NSTimer init() { timer = NSTimer(timeInterval: 600, target: self, selector: "check", userInfo: nil, repeats: true) } func check() { // Do some stuff } } 

但是,Swift不喜欢我将self传递给NSTimer初始值设定项的事实。 我在这里打破一些模式? 一个人应该如何完成这样的初始化?

你已经find了Implicitly Unwrapped Optional的主要用例。

  • 在初始化timer之前,您需要从init访问self
  • 否则, timer不应该是零,所以你不应该在init之外检查它。

所以,你应该声明let timer: NSTimer!

Swift 2有可能改变了什么。 我使用的代码如下所示:

 @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) } } 

同时需要@objc声明和NSObject子类。 还计时器需要是一个变种,不让。

除了隐式解包可选,我发现要获得代码工作,我需要NSObject的子类,也添加计时器到当前运行循环。

 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 } } 

根据评论更新代码 – 谢谢jtbandes和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 } }