gpt4 book ai didi

swift - 如何在 Swift 中传递回调函数

转载 作者:IT王子 更新时间:2023-10-29 05:13:19 25 4
gpt4 key购买 nike

我有一个简单的类,它的 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”不是“SecondViewController”的子类型

编辑 1:添加完整代码。

定时器.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
}

关于swift - 如何在 Swift 中传递回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25715869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com