Передача параметров методу, вызванному NSTimer в Swift
Я пытаюсь передать аргумент методу, который NSTimer вызывает в моем коде. Это исключение. Вот как я это делаю. Circle - мой пользовательский класс.
var circle = Circle()
var timer = NSTimer.scheduledTimerWithInterval(1.0, target: self, selector: animate, userInfo: circle, repeats: true)
Ниже приведен метод, который называется
func animate(circle: Circle) -> Void{
//do stuff with circle
}
Примечание. Метод находится в том же классе, который вызывается. Поэтому я считаю, что правильно настроил цель.
Ответы
Ответ 1
Селектор, который вы используете с NSTimer
, передается NSTimer
как один и только параметр. Поместите объект круга в него как userInfo
, и вы можете извлечь его, когда срабатывает таймер.
var circle = Circle()
var timer = NSTimer.scheduledTimerWithInterval(1.0, target: self, selector: "animate:", userInfo: circle, repeats: true)
func animate(timer:NSTimer){
var circle = timer.userInfo as Circle
//do stuff with circle
}
Ответ 2
Ваш селектор должен быть строкой, если это не должно быть ivar. Кроме того, ваша функция animate
имеет неправильную подпись. Следующие изменения заставят вас снова двигаться:
var circle = Circle()
var timer = NSTimer.scheduledTimerWithInterval(1.0, target: self, selector: "animate", userInfo: circle, repeats: true)
func animate(circle: Circle) -> () {
//do stuff with circle
}
Функция действительно не нуждается в возврате пустого кортежа; он может быть записан без -> ()
Я также видел строку селектора, завернутую в метод "Selector()": Selector("animate")
. Он работает в любом случае.
Я возился с NSTimer
и закрыл себя и написал статью на нем: Использование Swift Closures With NSTimer