Selector rápido: selector no reconocido enviado a instancia

Tengo una function:

func runRockRotation(rockSprite: SKSpriteNode){ startRockRotationAnimation(rockSprite, isRock: true) } 

Cuando lo llamo así:

 runRockRotation(rock) 

funciona, pero parece que no puedo ubicarlo dentro de un selector NSTimer.

 var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation:", userInfo: rock, repeats: false) 

Lea muchos foros, probó esto:

 var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation()", userInfo: rock, repeats: false) var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation(_)", userInfo: rock, repeats: false) var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation", userInfo: rock, repeats: false) 

También, probé sin rock, usando nada, pero nada parece funcionar.

Cada vez que recibo:

 2015-04-10 15:49:03.830 Meh[1640:218030] -[__NSCFTimer runAction:completion:]: unrecognized selector sent to instance 0x174166840 2015-04-10 15:49:03.832 Meh[1640:218030] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFTimer runAction:completion:]: unrecognized selector sent to instance 0x174166840' 

¿Cómo llamo a mi function en un selector con un parámetro? Sé cómo hacerlo en el Objetivo C, pero no puedo hacerlo en Swift. Toda ayuda será apreciada.

Consulte la documentation de scheduledTimerWithTimeInterval

Veras eso

El selector debe tener la siguiente firma: timerFireMethod: (incluye dos puntos para indicar que el método toma un argumento).

El timer pasa a sí mismo como el argumento, por lo que el método adoptará el siguiente patrón: - (void)timerFireMethod:(NSTimer *)timer

Su function no coincide con este patrón, por lo que no se puede encontrar el selector adecuado.

Use algo como:

 func runRockRotationForTimer(_ timer: NSTimer){ self.runRockRotation(timer.userInfo as? SKSpriteNode) timer.invalidate(); } 

y progtwigrlo usando

 var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotationForTimer:", userInfo: rock, repeats: false) 

También ayuda a asegurarse de que el object de destino (auto en su caso) es una subclass de NSObject

 var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: <THIS MUST BE NSOBJECT SUBCLASS>, selector: "runRockRotation:", userInfo: rock, repeats: false)