Передача параметров методу, вызванному 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