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

时间:2014-08-05 22:15:46

标签: ios swift ios8

我有一个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初始值设定项的事实。我在这里打破了一些模式吗?一个人应该如何完成这样的初始化?

2 个答案:

答案 0 :(得分:17)

您已找到Implicitly Unwrapped Optional的主要用例。

  • self初始化之前,您需要从init访问timer
  • 否则,timer 永远不会为零,因此您不必在init之外进行检查。

因此,您应该声明let timer: NSTimer!

答案 1 :(得分:0)

除了隐式展开的可选项之外,我发现要使代码正常工作,我需要继承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

    }
}