我试图在Swift中创建一个NSTimer,但我遇到了一些麻烦。
NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)
Test()是同一个类中的一个函数。
我在编辑器中得到一个错误:
无法找到一个超载的'init'接受提供的
参数
当我把selector: test()改为selector: nil时,错误就消失了。
我试过了:
选择器:测试()
选择器:测试
选择器:选择器(测试())
但是什么都没用,我在参考文献中找不到解决方案。
我发现很多答案都很有用,但我不清楚如何用一个不是按钮的东西来做到这一点。我在swift中添加了一个手势识别器到UILabel中,所以在阅读以上所有内容后,我发现以下是对我有用的:
let tapRecognizer = UITapGestureRecognizer(
target: self,
action: "labelTapped:")
其中“Selector”被声明为:
func labelTapped(sender: UILabel) { }
请注意,它是公共的,我没有使用Selector()语法,但也可以这样做。
let tapRecognizer = UITapGestureRecognizer(
target: self,
action: Selector("labelTapped:"))
正如许多人所说,选择器是一种动态调用方法的objective - c方式,已经被带到了Swift中,在某些情况下我们仍然坚持使用它,比如UIKit,可能是因为他们在SwiftUI上工作来取代它,但一些api有更Swift的版本,比如Swift Timer,例如你可以使用
class func scheduledTimer(withTimeInterval interval: TimeInterval,
repeats: Bool,
block: @escaping (Timer) -> Void) -> Timer
相反,你可以这样称呼它
Timer.scheduledTimer(withTimeInterval: 1,
repeats: true ) {
... your test code here
}
or
Timer.scheduledTimer(withTimeInterval: 1,
repeats: true,
block: test)
方法test需要一个Timer参数,或者如果你想test需要一个命名参数
Timer.scheduledTimer(withTimeInterval: 1,
repeats: true,
block: test(timer:))
你也应该使用Timer而不是NSTimer因为NSTimer是objective-c的旧名字