我有一个RNG并希望它每隔三秒就会消失一次。到目前为止我已经
了var timer = NSTimer(timeInterval: 3, target: self , selector: randomnumbers, userInfo: nil, repeats: true)
func randomnumbers() {
var rockNamesArray:[String] = ["bird", "rock2", "rock3"]
var rockpos = Int(arc4random_uniform(UInt32(3)))
}
但我有一堆错误信息,我不确定如何组织它。
修改
此代码中的错误消息告诉我它有一个未解析的标识符" self"所有其他错误都只是因为我已经改变了这个代码,比如未解析的标识符rockNamesArray和rockpos,它们在三个不同的代码行中发生了4次。
EDIT2
如评论中所述,上述代码位于一个类之外,该类解释了self
无效。但是在这种情况下如何解决定时器例程?
答案 0 :(得分:1)
它有一个未解析的标识符“self”
听起来您提供的代码不是实例方法的一部分。 self
是一个关键字,指的是代码正在执行的对象。如果您没有对象,则没有self
,因此出现错误。要解决此问题,您可以将指针传递给其他具有randomnumbers
选择器的对象,而不是self
。
答案 1 :(得分:0)
试试这个:
var timer = NSTimer(timeInterval:3, target:self, selector:Selector("randomnumbers:"), userInfo: nil, repeats: true)
func randomnumbers(timer:NSTimer) {
var rockNamesArray:[String] = ["bird", "rock2", "rock3"]
var rockpos = Int(arc4random_uniform(UInt32(3)))
}
因为计时器例程需要一个计时器对象。
编辑您需要将它放在(虚拟)类中,如下所示:
class MyTimer {
var timer: NSTimer
init() {
timer = NSTimer(timeInterval:3, target:self , selector:Selector("randomnumbers:"), userInfo:nil, repeats:true)
}
func randomnumbers(timer:NSTimer) {
// ...
}
}
let myTimer = MyTimer()
答案 2 :(得分:0)
写selector: "randomnumbers"
代替selector: randomnumbers
。您可以使用timer = NSTimer.scheduledTimerWithTimeInterval
代替timer = NSTimer(timeInterval...
来实例化计时器并同时启动它。在你的控制器中调用它,例如在viewDidLoad
另请注意,您的randomnumbers()不会执行任何操作。您为rockpos分配值,但不对其执行任何操作。所以你将无法看到计时器是否正常工作......
答案 3 :(得分:0)
在Swift第一阶段初始化完成之前,为每个存储属性分配初始值时,不能将self
称为值。
正如The Swift Programming Language
所说:
Swift中的类初始化是一个两阶段的过程。在第一阶段,每个存储的属性都由引入它的类分配初始值。一旦确定了每个存储属性的初始状态,第二阶段就开始了,每个类都有机会在新实例被认为可以使用之前进一步定制其存储的属性。
初始化程序无法调用任何实例方法,读取任何实例属性的值,或者在初始化的第一阶段完成之后将self作为值引用。