如何在Swift中传递回调函数

前端之家收集整理的这篇文章主要介绍了如何在Swift中传递回调函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的类,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
    }
原文链接:https://www.f2er.com/swift/319794.html

猜你在找的Swift相关文章