【发布时间】:2016-02-03 22:04:53
【问题描述】:
我有一个简单的类,init 方法接受一个 Int 和一个回调函数。
class Timer {
var timer = NSTimer()
var handler: (Int) -> Void
init(duration: Int, handler: (Int) -> Void) {
self.duration = duration
self.handler = handler
self.start()
}
@objc func someMethod() {
self.handler(10)
}
}
然后在 ViewController 我有这个:
var timer = Timer(duration: 5, handler: displayTimeRemaining)
func displayTimeRemaining(counter: Int) -> Void {
println(counter)
}
这不起作用,我得到以下信息:
'Int' is not a subtype of 'SecondViewController'
编辑 1:添加完整代码。
Timer.swift
import UIKit
class Timer {
lazy var timer = NSTimer()
var handler: (Int) -> Void
let duration: Int
var elapsedTime: Int = 0
init(duration: Int, handler: (Int) -> Void) {
self.duration = duration
self.handler = handler
self.start()
}
func start() {
self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0,
target: self,
selector: Selector("tick"),
userInfo: nil,
repeats: true)
}
func stop() {
timer.invalidate()
}
func tick() {
self.elapsedTime++
self.handler(10)
if self.elapsedTime == self.duration {
self.stop()
}
}
deinit {
self.timer.invalidate()
}
}
SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
@IBOutlet var cycleCounter: UILabel!
var number = 0
var timer = Timer(duration: 5, handler: displayTimeRemaining)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func btnIncrementCycle_Click(sender: UIButton){
cycleCounter.text = String(++number)
println(number)
}
func displayTimeRemaining(counter: Int) -> Void {
println(counter)
}
}
我刚开始使用 Swift,所以我很年轻。你应该如何传递回调?我已经查看了示例,我认为这应该可以工作。我的类是否针对我传递回调的方式定义不正确?
谢谢
【问题讨论】:
-
尝试传递
self.displayTimeRemaining。 Swift 可能需要显式引用实例方法来消除歧义;我知道这在其他语言中很常见。 (遗憾的是,我手边没有 mac,所以无法测试这是否为您解决了问题。) -
没用。 :( 这是现在的错误:
'SecondViewController -> () -> SecondViewController!' does not have a member named 'displayTimeRemaining'。我想知道是不是我在控制器中错误地声明了函数?我使用了您在上面代码中看到的基本语法。 -
init()中的self.duration和self.start()应该是timer.duration和timer.start()吗?
-
@davecom 不是。
start和duration是Timer类的函数和属性,而不是NSTimer的timer实例。我没有在此处的 sn-p 中包含这些,但它们在我的代码中。无论如何,我认为这不会影响我无法将函数传递给init类而不会出错。 -
你会粘贴完整的代码来实例化 Timer 类变量吗?
标签: swift