如何在Swift中传递回调函数
发布时间:2020-12-14 05:37:27 所属栏目:百科 来源:网络整理
导读:我有一个简单的类,init方法接受一个I??nt和一个回调函数. 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 someM
我有一个简单的类,init方法接受一个I??nt和一个回调函数.
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’不是’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开始,所以我很绿.你应该如何传回回调?我看过例子,这应该是我想的.我的类的定义是不正确的,因为我传递回调的方式吗? 谢谢
好的,现在有了完整的代码,我能够复制你的问题.我不是100%肯定是什么原因,但我相信它与在类被实例化之前引用一个类方法(displayTimeRemaining)有关.这里有几种方法:
选项1:在SecondViewController类之外声明处理程序方法: func displayTimeRemaining(counter: Int) -> Void { println(counter) } class SecondViewController: UIViewController { // ... var timer = Timer(duration: 5,handler: displayTimeRemaining) 选项2:通过将class关键字添加到函数声明中,将displayTimeRemaining转换为类型方法. class SecondViewController: UIViewController { var timer: Timer = Timer(duration: 5,handler: SecondViewController.displayTimeRemaining) class func displayTimeRemaining(counter: Int) -> Void { println(counter) } 选项3:我相信这将是最符合Swift的思维方式 – 使用闭包: class SecondViewController: UIViewController { var timer: Timer = Timer(duration: 5) { println($0) //using Swift's anonymous method params } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |